| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../closure.dart'; | 7 import '../closure.dart'; |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../constants/values.dart'; | 9 import '../constants/values.dart'; |
| 10 import '../common_elements.dart'; | 10 import '../common_elements.dart'; |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 MemberKind get kind; | 224 MemberKind get kind; |
| 225 | 225 |
| 226 /// The defining [ir.Node] for this member, if supported by its [kind]. | 226 /// The defining [ir.Node] for this member, if supported by its [kind]. |
| 227 /// | 227 /// |
| 228 /// For a regular class this is the [ir.Class] node. For closure classes this | 228 /// For a regular class this is the [ir.Class] node. For closure classes this |
| 229 /// might be an [ir.FunctionExpression] node if needed. | 229 /// might be an [ir.FunctionExpression] node if needed. |
| 230 ir.Node get node; | 230 ir.Node get node; |
| 231 | 231 |
| 232 /// The canonical location of [member]. This is used for sorting the members | 232 /// The canonical location of [member]. This is used for sorting the members |
| 233 /// in the emitted code. | 233 /// in the emitted code. |
| 234 ir.Location get location; | 234 SourceSpan get location; |
| 235 } | 235 } |
| 236 | 236 |
| 237 enum ClassKind { | 237 enum ClassKind { |
| 238 regular, | 238 regular, |
| 239 closure, | 239 closure, |
| 240 } | 240 } |
| 241 | 241 |
| 242 /// A member directly defined by its [ir.Member] node. | 242 /// A member directly defined by its [ir.Member] node. |
| 243 class RegularMemberDefinition implements MemberDefinition { | 243 class RegularMemberDefinition implements MemberDefinition { |
| 244 final MemberEntity member; | 244 final MemberEntity member; |
| 245 final ir.Member node; | 245 final ir.Member node; |
| 246 | 246 |
| 247 RegularMemberDefinition(this.member, this.node); | 247 RegularMemberDefinition(this.member, this.node); |
| 248 | 248 |
| 249 ir.Location get location => node.location; | 249 SourceSpan get location => computeSourceSpanFromTreeNode(node); |
| 250 | 250 |
| 251 MemberKind get kind => MemberKind.regular; | 251 MemberKind get kind => MemberKind.regular; |
| 252 | 252 |
| 253 String toString() => 'RegularMemberDefinition(kind:$kind,member:$member,' | 253 String toString() => 'RegularMemberDefinition(kind:$kind,member:$member,' |
| 254 'node:$node,location:$location)'; | 254 'node:$node,location:$location)'; |
| 255 } | 255 } |
| 256 | 256 |
| 257 /// The definition of a special kind of member | 257 /// The definition of a special kind of member |
| 258 class SpecialMemberDefinition implements MemberDefinition { | 258 class SpecialMemberDefinition implements MemberDefinition { |
| 259 final MemberEntity member; | 259 final MemberEntity member; |
| 260 final ir.TreeNode node; | 260 final ir.TreeNode node; |
| 261 final MemberKind kind; | 261 final MemberKind kind; |
| 262 | 262 |
| 263 SpecialMemberDefinition(this.member, this.node, this.kind); | 263 SpecialMemberDefinition(this.member, this.node, this.kind); |
| 264 | 264 |
| 265 ir.Location get location => node.location; | 265 SourceSpan get location => computeSourceSpanFromTreeNode(node); |
| 266 | 266 |
| 267 String toString() => 'SpecialMemberDefinition(kind:$kind,member:$member,' | 267 String toString() => 'SpecialMemberDefinition(kind:$kind,member:$member,' |
| 268 'node:$node,location:$location)'; | 268 'node:$node,location:$location)'; |
| 269 } | 269 } |
| 270 | 270 |
| 271 /// Definition information for a [ClassEntity]. | 271 /// Definition information for a [ClassEntity]. |
| 272 abstract class ClassDefinition { | 272 abstract class ClassDefinition { |
| 273 /// The defined class. | 273 /// The defined class. |
| 274 ClassEntity get cls; | 274 ClassEntity get cls; |
| 275 | 275 |
| 276 /// The kind of the defined class. This determines the semantics of [node]. | 276 /// The kind of the defined class. This determines the semantics of [node]. |
| 277 ClassKind get kind; | 277 ClassKind get kind; |
| 278 | 278 |
| 279 /// The defining [ir.Node] for this class, if supported by its [kind]. | 279 /// The defining [ir.Node] for this class, if supported by its [kind]. |
| 280 ir.Node get node; | 280 ir.Node get node; |
| 281 | 281 |
| 282 /// The canonical location of [cls]. This is used for sorting the classes | 282 /// The canonical location of [cls]. This is used for sorting the classes |
| 283 /// in the emitted code. | 283 /// in the emitted code. |
| 284 ir.Location get location; | 284 SourceSpan get location; |
| 285 } | 285 } |
| 286 | 286 |
| 287 /// A class directly defined by its [ir.Class] node. | 287 /// A class directly defined by its [ir.Class] node. |
| 288 class RegularClassDefinition implements ClassDefinition { | 288 class RegularClassDefinition implements ClassDefinition { |
| 289 final ClassEntity cls; | 289 final ClassEntity cls; |
| 290 final ir.Class node; | 290 final ir.Class node; |
| 291 | 291 |
| 292 RegularClassDefinition(this.cls, this.node); | 292 RegularClassDefinition(this.cls, this.node); |
| 293 | 293 |
| 294 ir.Location get location => node.location; | 294 SourceSpan get location => computeSourceSpanFromTreeNode(node); |
| 295 | 295 |
| 296 ClassKind get kind => ClassKind.regular; | 296 ClassKind get kind => ClassKind.regular; |
| 297 | 297 |
| 298 String toString() => 'RegularClassDefinition(kind:$kind,cls:$cls,' | 298 String toString() => 'RegularClassDefinition(kind:$kind,cls:$cls,' |
| 299 'node:$node,location:$location)'; | 299 'node:$node,location:$location)'; |
| 300 } | 300 } |
| 301 | 301 |
| 302 /// Kinds of foreign functions. | 302 /// Kinds of foreign functions. |
| 303 enum ForeignKind { | 303 enum ForeignKind { |
| 304 JS, | 304 JS, |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 /// [closureClassMaps]. | 424 /// [closureClassMaps]. |
| 425 CapturedLoopScope getCapturedLoopScope( | 425 CapturedLoopScope getCapturedLoopScope( |
| 426 ClosureDataLookup closureLookup, ir.TreeNode node); | 426 ClosureDataLookup closureLookup, ir.TreeNode node); |
| 427 } | 427 } |
| 428 | 428 |
| 429 /// Comparator for the canonical order or named arguments. | 429 /// Comparator for the canonical order or named arguments. |
| 430 // TODO(johnniwinther): Remove this when named parameters are sorted in dill. | 430 // TODO(johnniwinther): Remove this when named parameters are sorted in dill. |
| 431 int namedOrdering(ir.VariableDeclaration a, ir.VariableDeclaration b) { | 431 int namedOrdering(ir.VariableDeclaration a, ir.VariableDeclaration b) { |
| 432 return a.name.compareTo(b.name); | 432 return a.name.compareTo(b.name); |
| 433 } | 433 } |
| 434 |
| 435 SourceSpan computeSourceSpanFromTreeNode(ir.TreeNode node) { |
| 436 // TODO(johnniwinther): Use [ir.Location] directly as a [SourceSpan]. |
| 437 Uri uri; |
| 438 int offset; |
| 439 while (node != null) { |
| 440 if (node.fileOffset != ir.TreeNode.noOffset) { |
| 441 offset = node.fileOffset; |
| 442 uri = Uri.parse(node.location.file); |
| 443 break; |
| 444 } |
| 445 node = node.parent; |
| 446 } |
| 447 if (uri != null) { |
| 448 return new SourceSpan(uri, offset, offset + 1); |
| 449 } |
| 450 return null; |
| 451 } |
| OLD | NEW |