| 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/builder.dart' show Builder, TypeVariableBuilder; | 7 import 'builder/builder.dart' show Builder, TypeVariableBuilder; |
| 8 | 8 |
| 9 import 'deprecated_problems.dart' | 9 import 'deprecated_problems.dart' show deprecated_InputError; |
| 10 show deprecated_InputError, deprecated_internalProblem; | 10 |
| 11 import 'problems.dart' show internalProblem, unsupported; |
| 12 |
| 13 import 'fasta_codes.dart' show messageInternalProblemExtendingUnmodifiableScope; |
| 11 | 14 |
| 12 class MutableScope { | 15 class MutableScope { |
| 13 /// Names declared in this scope. | 16 /// Names declared in this scope. |
| 14 Map<String, Builder> local; | 17 Map<String, Builder> local; |
| 15 | 18 |
| 16 /// Setters declared in this scope. | 19 /// Setters declared in this scope. |
| 17 Map<String, Builder> setters; | 20 Map<String, Builder> setters; |
| 18 | 21 |
| 19 /// The scope that this scope is nested within, or `null` if this is the top | 22 /// The scope that this scope is nested within, or `null` if this is the top |
| 20 /// level scope. | 23 /// level scope. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 43 isModifiable: isModifiable); | 46 isModifiable: isModifiable); |
| 44 | 47 |
| 45 Scope.immutable() | 48 Scope.immutable() |
| 46 : this(const <String, Builder>{}, const <String, Builder>{}, null, | 49 : this(const <String, Builder>{}, const <String, Builder>{}, null, |
| 47 isModifiable: false); | 50 isModifiable: false); |
| 48 | 51 |
| 49 Scope.nested(Scope parent, {bool isModifiable: true}) | 52 Scope.nested(Scope parent, {bool isModifiable: true}) |
| 50 : this(<String, Builder>{}, null, parent, isModifiable: isModifiable); | 53 : this(<String, Builder>{}, null, parent, isModifiable: isModifiable); |
| 51 | 54 |
| 52 /// Don't use this. Use [becomePartOf] instead. | 55 /// Don't use this. Use [becomePartOf] instead. |
| 53 void set local(_) => deprecated_internalProblem("Unsupported operation."); | 56 void set local(_) => unsupported("local=", -1, null); |
| 54 | 57 |
| 55 /// Don't use this. Use [becomePartOf] instead. | 58 /// Don't use this. Use [becomePartOf] instead. |
| 56 void set setters(_) => deprecated_internalProblem("Unsupported operation."); | 59 void set setters(_) => unsupported("setters=", -1, null); |
| 57 | 60 |
| 58 /// Don't use this. Use [becomePartOf] instead. | 61 /// Don't use this. Use [becomePartOf] instead. |
| 59 void set parent(_) => deprecated_internalProblem("Unsupported operation."); | 62 void set parent(_) => unsupported("parent=", -1, null); |
| 60 | 63 |
| 61 /// This scope becomes equivalent to [scope]. This is used for parts to | 64 /// This scope becomes equivalent to [scope]. This is used for parts to |
| 62 /// become part of their library's scope. | 65 /// become part of their library's scope. |
| 63 void becomePartOf(Scope scope) { | 66 void becomePartOf(Scope scope) { |
| 64 assert(parent.parent == null); | 67 assert(parent.parent == null); |
| 65 assert(scope.parent.parent == null); | 68 assert(scope.parent.parent == null); |
| 66 super.local = scope.local; | 69 super.local = scope.local; |
| 67 super.setters = scope.setters; | 70 super.setters = scope.setters; |
| 68 super.parent = scope.parent; | 71 super.parent = scope.parent; |
| 69 } | 72 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 } | 116 } |
| 114 | 117 |
| 115 Builder lookup(String name, int charOffset, Uri fileUri, | 118 Builder lookup(String name, int charOffset, Uri fileUri, |
| 116 {bool isInstanceScope: true}) { | 119 {bool isInstanceScope: true}) { |
| 117 recordUse(name, charOffset, fileUri); | 120 recordUse(name, charOffset, fileUri); |
| 118 Builder builder = | 121 Builder builder = |
| 119 lookupIn(name, charOffset, fileUri, local, isInstanceScope); | 122 lookupIn(name, charOffset, fileUri, local, isInstanceScope); |
| 120 if (builder != null) return builder; | 123 if (builder != null) return builder; |
| 121 builder = lookupIn(name, charOffset, fileUri, setters, isInstanceScope); | 124 builder = lookupIn(name, charOffset, fileUri, setters, isInstanceScope); |
| 122 if (builder != null && !builder.hasProblem) { | 125 if (builder != null && !builder.hasProblem) { |
| 123 return new deprecated_AccessErrorBuilder( | 126 return new AccessErrorBuilder(name, builder, charOffset, fileUri); |
| 124 name, builder, charOffset, fileUri); | |
| 125 } | 127 } |
| 126 if (!isInstanceScope) { | 128 if (!isInstanceScope) { |
| 127 // For static lookup, do not seach the parent scope. | 129 // For static lookup, do not seach the parent scope. |
| 128 return builder; | 130 return builder; |
| 129 } | 131 } |
| 130 return builder ?? parent?.lookup(name, charOffset, fileUri); | 132 return builder ?? parent?.lookup(name, charOffset, fileUri); |
| 131 } | 133 } |
| 132 | 134 |
| 133 Builder lookupSetter(String name, int charOffset, Uri fileUri, | 135 Builder lookupSetter(String name, int charOffset, Uri fileUri, |
| 134 {bool isInstanceScope: true}) { | 136 {bool isInstanceScope: true}) { |
| 135 recordUse(name, charOffset, fileUri); | 137 recordUse(name, charOffset, fileUri); |
| 136 Builder builder = | 138 Builder builder = |
| 137 lookupIn(name, charOffset, fileUri, setters, isInstanceScope); | 139 lookupIn(name, charOffset, fileUri, setters, isInstanceScope); |
| 138 if (builder != null) return builder; | 140 if (builder != null) return builder; |
| 139 builder = lookupIn(name, charOffset, fileUri, local, isInstanceScope); | 141 builder = lookupIn(name, charOffset, fileUri, local, isInstanceScope); |
| 140 if (builder != null && !builder.hasProblem) { | 142 if (builder != null && !builder.hasProblem) { |
| 141 return new deprecated_AccessErrorBuilder( | 143 return new AccessErrorBuilder(name, builder, charOffset, fileUri); |
| 142 name, builder, charOffset, fileUri); | |
| 143 } | 144 } |
| 144 if (!isInstanceScope) { | 145 if (!isInstanceScope) { |
| 145 // For static lookup, do not seach the parent scope. | 146 // For static lookup, do not seach the parent scope. |
| 146 return builder; | 147 return builder; |
| 147 } | 148 } |
| 148 return builder ?? parent?.lookupSetter(name, charOffset, fileUri); | 149 return builder ?? parent?.lookupSetter(name, charOffset, fileUri); |
| 149 } | 150 } |
| 150 | 151 |
| 151 bool hasLocalLabel(String name) => labels != null && labels.containsKey(name); | 152 bool hasLocalLabel(String name) => labels != null && labels.containsKey(name); |
| 152 | 153 |
| 153 void declareLabel(String name, Builder target) { | 154 void declareLabel(String name, Builder target) { |
| 154 if (isModifiable) { | 155 if (isModifiable) { |
| 155 labels ??= <String, Builder>{}; | 156 labels ??= <String, Builder>{}; |
| 156 labels[name] = target; | 157 labels[name] = target; |
| 157 } else { | 158 } else { |
| 158 deprecated_internalProblem("Can't extend an unmodifiable scope."); | 159 internalProblem( |
| 160 messageInternalProblemExtendingUnmodifiableScope, -1, null); |
| 159 } | 161 } |
| 160 } | 162 } |
| 161 | 163 |
| 162 void forwardDeclareLabel(String name, Builder target) { | 164 void forwardDeclareLabel(String name, Builder target) { |
| 163 declareLabel(name, target); | 165 declareLabel(name, target); |
| 164 forwardDeclaredLabels ??= <String, Builder>{}; | 166 forwardDeclaredLabels ??= <String, Builder>{}; |
| 165 forwardDeclaredLabels[name] = target; | 167 forwardDeclaredLabels[name] = target; |
| 166 } | 168 } |
| 167 | 169 |
| 168 void claimLabel(String name) { | 170 void claimLabel(String name) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 189 deprecated_InputError declare( | 191 deprecated_InputError declare( |
| 190 String name, Builder builder, int charOffset, Uri fileUri) { | 192 String name, Builder builder, int charOffset, Uri fileUri) { |
| 191 if (isModifiable) { | 193 if (isModifiable) { |
| 192 if (usedNames?.containsKey(name) ?? false) { | 194 if (usedNames?.containsKey(name) ?? false) { |
| 193 return new deprecated_InputError( | 195 return new deprecated_InputError( |
| 194 fileUri, usedNames[name], "Previous use of '$name'."); | 196 fileUri, usedNames[name], "Previous use of '$name'."); |
| 195 } | 197 } |
| 196 recordUse(name, charOffset, fileUri); | 198 recordUse(name, charOffset, fileUri); |
| 197 local[name] = builder; | 199 local[name] = builder; |
| 198 } else { | 200 } else { |
| 199 deprecated_internalProblem("Can't extend an unmodifiable scope."); | 201 internalProblem( |
| 202 messageInternalProblemExtendingUnmodifiableScope, -1, null); |
| 200 } | 203 } |
| 201 return null; | 204 return null; |
| 202 } | 205 } |
| 203 | 206 |
| 204 void merge(Scope scope, | 207 void merge(Scope scope, |
| 205 buildAmbiguousBuilder(String name, Builder existing, Builder member)) { | 208 buildAmbiguousBuilder(String name, Builder existing, Builder member)) { |
| 206 Map<String, Builder> map = local; | 209 Map<String, Builder> map = local; |
| 207 | 210 |
| 208 void mergeMember(String name, Builder member) { | 211 void mergeMember(String name, Builder member) { |
| 209 Builder existing = map[name]; | 212 Builder existing = map[name]; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 bool get hasProblem => true; | 280 bool get hasProblem => true; |
| 278 | 281 |
| 279 String get deprecated_message; | 282 String get deprecated_message; |
| 280 | 283 |
| 281 @override | 284 @override |
| 282 String get fullNameForErrors => name; | 285 String get fullNameForErrors => name; |
| 283 } | 286 } |
| 284 | 287 |
| 285 /// Represents a [builder] that's being accessed incorrectly. For example, an | 288 /// Represents a [builder] that's being accessed incorrectly. For example, an |
| 286 /// attempt to write to a final field, or to read from a setter. | 289 /// attempt to write to a final field, or to read from a setter. |
| 287 class deprecated_AccessErrorBuilder extends ProblemBuilder { | 290 class AccessErrorBuilder extends ProblemBuilder { |
| 288 deprecated_AccessErrorBuilder( | 291 AccessErrorBuilder(String name, Builder builder, int charOffset, Uri fileUri) |
| 289 String name, Builder builder, int charOffset, Uri fileUri) | |
| 290 : super(name, builder, charOffset, fileUri); | 292 : super(name, builder, charOffset, fileUri); |
| 291 | 293 |
| 292 Builder get parent => builder; | 294 Builder get parent => builder; |
| 293 | 295 |
| 294 bool get isFinal => builder.isFinal; | 296 bool get isFinal => builder.isFinal; |
| 295 | 297 |
| 296 bool get isField => builder.isField; | 298 bool get isField => builder.isField; |
| 297 | 299 |
| 298 bool get isRegularMethod => builder.isRegularMethod; | 300 bool get isRegularMethod => builder.isRegularMethod; |
| 299 | 301 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 313 | 315 |
| 314 String get deprecated_message => "Access error: '$name'."; | 316 String get deprecated_message => "Access error: '$name'."; |
| 315 } | 317 } |
| 316 | 318 |
| 317 class AmbiguousBuilder extends ProblemBuilder { | 319 class AmbiguousBuilder extends ProblemBuilder { |
| 318 AmbiguousBuilder(String name, Builder builder, int charOffset, Uri fileUri) | 320 AmbiguousBuilder(String name, Builder builder, int charOffset, Uri fileUri) |
| 319 : super(name, builder, charOffset, fileUri); | 321 : super(name, builder, charOffset, fileUri); |
| 320 | 322 |
| 321 String get deprecated_message => "Duplicated named: '$name'."; | 323 String get deprecated_message => "Duplicated named: '$name'."; |
| 322 } | 324 } |
| OLD | NEW |