@@ -1223,7 +1223,7 @@ export class Program extends DiagnosticEmitter {
1223
1223
) ;
1224
1224
}
1225
1225
} else { // i.e. export { foo [as bar] }
1226
- let element = file . lookupInSelf ( localName ) ;
1226
+ let element = file . getMember ( localName ) ;
1227
1227
if ( element ) {
1228
1228
file . ensureExport ( exportName , element ) ;
1229
1229
} else {
@@ -1751,7 +1751,7 @@ export class Program extends DiagnosticEmitter {
1751
1751
}
1752
1752
1753
1753
// exported from this file
1754
- element = foreignFile . lookupInSelf ( queuedExport . localIdentifier . text ) ;
1754
+ element = foreignFile . getMember ( queuedExport . localIdentifier . text ) ;
1755
1755
if ( element ) return element ;
1756
1756
}
1757
1757
}
@@ -2200,7 +2200,7 @@ export class Program extends DiagnosticEmitter {
2200
2200
if ( foreignPath === null ) {
2201
2201
2202
2202
// resolve right away if the local element already exists
2203
- if ( element = localFile . lookupInSelf ( localName ) ) {
2203
+ if ( element = localFile . getMember ( localName ) ) {
2204
2204
localFile . ensureExport ( foreignName , element ) ;
2205
2205
2206
2206
// otherwise queue it
@@ -2514,7 +2514,7 @@ export class Program extends DiagnosticEmitter {
2514
2514
this . checkDecorators ( declaration . decorators , DecoratorFlags . GLOBAL )
2515
2515
) ;
2516
2516
if ( ! parent . add ( name , original ) ) return null ;
2517
- var element = assert ( parent . lookupInSelf ( name ) ) ; // possibly merged
2517
+ var element = assert ( parent . getMember ( name ) ) ; // possibly merged
2518
2518
var members = declaration . members ;
2519
2519
for ( let i = 0 , k = members . length ; i < k ; ++ i ) {
2520
2520
let member = members [ i ] ;
@@ -2775,15 +2775,17 @@ export abstract class Element {
2775
2775
/** Tests if this element has a specific decorator flag or flags. */
2776
2776
hasDecorator ( flag : DecoratorFlags ) : bool { return ( this . decoratorFlags & flag ) == flag ; }
2777
2777
2778
- /** Looks up the element with the specified name within this element . */
2779
- lookupInSelf ( name : string ) : DeclaredElement | null {
2778
+ /** Get the member with the specified name, if any . */
2779
+ getMember ( name : string ) : DeclaredElement | null {
2780
2780
var members = this . members ;
2781
- if ( members !== null && members . has ( name ) ) return assert ( members . get ( name ) ) ;
2781
+ if ( members && members . has ( name ) ) return assert ( members . get ( name ) ) ;
2782
2782
return null ;
2783
2783
}
2784
2784
2785
- /** Looks up the element with the specified name relative to this element, like in JS. */
2786
- abstract lookup ( name : string ) : Element | null ;
2785
+ /** Looks up the element with the specified name relative to this element. */
2786
+ lookup ( name : string , isType : bool = false ) : Element | null {
2787
+ return this . parent . lookup ( name , isType ) ;
2788
+ }
2787
2789
2788
2790
/** Adds an element as a member of this one. Reports and returns `false` if a duplicate. */
2789
2791
add ( name : string , element : DeclaredElement , localIdentifierIfImport : IdentifierExpression | null = null ) : bool {
@@ -3038,7 +3040,7 @@ export class File extends Element {
3038
3040
element = this . program . ensureGlobal ( name , element ) ; // possibly merged globally
3039
3041
}
3040
3042
if ( ! super . add ( name , element , localIdentifierIfImport ) ) return false ;
3041
- element = assert ( this . lookupInSelf ( name ) ) ; // possibly merged locally
3043
+ element = assert ( this . getMember ( name ) ) ; // possibly merged locally
3042
3044
if ( element . is ( CommonFlags . EXPORT ) && ! localIdentifierIfImport ) {
3043
3045
this . ensureExport (
3044
3046
element . name ,
@@ -3049,23 +3051,23 @@ export class File extends Element {
3049
3051
}
3050
3052
3051
3053
/* @override */
3052
- lookupInSelf ( name : string ) : DeclaredElement | null {
3053
- var element = super . lookupInSelf ( name ) ;
3054
+ getMember ( name : string ) : DeclaredElement | null {
3055
+ var element = super . getMember ( name ) ;
3054
3056
if ( element ) return element ;
3055
3057
var exportsStar = this . exportsStar ;
3056
3058
if ( exportsStar ) {
3057
3059
for ( let i = 0 , k = exportsStar . length ; i < k ; ++ i ) {
3058
- if ( element = exportsStar [ i ] . lookupInSelf ( name ) ) return element ;
3060
+ if ( element = exportsStar [ i ] . getMember ( name ) ) return element ;
3059
3061
}
3060
3062
}
3061
3063
return null ;
3062
3064
}
3063
3065
3064
3066
/* @override */
3065
- lookup ( name : string ) : Element | null {
3066
- var element = this . lookupInSelf ( name ) ;
3067
+ lookup ( name : string , isType : bool = false ) : Element | null {
3068
+ var element = this . getMember ( name ) ;
3067
3069
if ( element ) return element ;
3068
- return this . program . lookup ( name ) ;
3070
+ return this . program . lookup ( name ) ; // has no meaningful parent
3069
3071
}
3070
3072
3071
3073
/** Ensures that an element is an export of this file. */
@@ -3176,11 +3178,6 @@ export class TypeDefinition extends TypedElement {
3176
3178
get typeNode ( ) : TypeNode {
3177
3179
return ( < TypeDeclaration > this . declaration ) . type ;
3178
3180
}
3179
-
3180
- /* @override */
3181
- lookup ( name : string ) : Element | null {
3182
- return this . parent . lookup ( name ) ;
3183
- }
3184
3181
}
3185
3182
3186
3183
/** A namespace that differs from a file in being user-declared with a name. */
@@ -3209,10 +3206,10 @@ export class Namespace extends DeclaredElement {
3209
3206
}
3210
3207
3211
3208
/* @override */
3212
- lookup ( name : string ) : Element | null {
3213
- var inSelf = this . lookupInSelf ( name ) ;
3214
- if ( inSelf ) return inSelf ;
3215
- return this . parent . lookup ( name ) ;
3209
+ lookup ( name : string , isType : bool = false ) : Element | null {
3210
+ var member = this . getMember ( name ) ;
3211
+ if ( member ) return member ;
3212
+ return super . lookup ( name , isType ) ;
3216
3213
}
3217
3214
}
3218
3215
@@ -3243,10 +3240,10 @@ export class Enum extends TypedElement {
3243
3240
}
3244
3241
3245
3242
/* @override */
3246
- lookup ( name : string ) : Element | null {
3247
- var inSelf = this . lookupInSelf ( name ) ;
3248
- if ( inSelf ) return inSelf ;
3249
- return this . parent . lookup ( name ) ;
3243
+ lookup ( name : string , isType : bool = false ) : Element | null {
3244
+ var member = this . getMember ( name ) ;
3245
+ if ( member ) return member ;
3246
+ return super . lookup ( name , isType ) ;
3250
3247
}
3251
3248
}
3252
3249
@@ -3319,11 +3316,6 @@ export abstract class VariableLikeElement extends TypedElement {
3319
3316
this . constantFloatValue = value ;
3320
3317
this . set ( CommonFlags . CONST | CommonFlags . INLINED | CommonFlags . RESOLVED ) ;
3321
3318
}
3322
-
3323
- /** @override */
3324
- lookup ( name : string ) : Element | null {
3325
- return this . parent . lookup ( name ) ;
3326
- }
3327
3319
}
3328
3320
3329
3321
/** An enum value. */
@@ -3357,11 +3349,6 @@ export class EnumValue extends VariableLikeElement {
3357
3349
get valueNode ( ) : Expression | null {
3358
3350
return ( < EnumValueDeclaration > this . declaration ) . initializer ;
3359
3351
}
3360
-
3361
- /* @override */
3362
- lookup ( name : string ) : Element | null {
3363
- return this . parent . lookup ( name ) ;
3364
- }
3365
3352
}
3366
3353
3367
3354
/** A global variable. */
@@ -3546,11 +3533,6 @@ export class FunctionPrototype extends DeclaredElement {
3546
3533
else assert ( ! instances . has ( instanceKey ) ) ;
3547
3534
instances . set ( instanceKey , instance ) ;
3548
3535
}
3549
-
3550
- /* @override */
3551
- lookup ( name : string ) : Element | null {
3552
- return this . parent . lookup ( name ) ;
3553
- }
3554
3536
}
3555
3537
3556
3538
/** A resolved function. */
@@ -3709,10 +3691,12 @@ export class Function extends TypedElement {
3709
3691
}
3710
3692
3711
3693
/* @override */
3712
- lookup ( name : string ) : Element | null {
3713
- var locals = this . localsByName ;
3714
- if ( locals . has ( name ) ) return assert ( locals . get ( name ) ) ;
3715
- return this . parent . lookup ( name ) ;
3694
+ lookup ( name : string , isType : bool = false ) : Element | null {
3695
+ if ( ! isType ) {
3696
+ let locals = this . localsByName ;
3697
+ if ( locals . has ( name ) ) return assert ( locals . get ( name ) ) ;
3698
+ }
3699
+ return super . lookup ( name , isType ) ;
3716
3700
}
3717
3701
3718
3702
// used by flows to keep track of temporary locals
@@ -3797,11 +3781,6 @@ export class FieldPrototype extends DeclaredElement {
3797
3781
get parameterIndex ( ) : i32 {
3798
3782
return ( < FieldDeclaration > this . declaration ) . parameterIndex ;
3799
3783
}
3800
-
3801
- /* @override */
3802
- lookup ( name : string ) : Element | null {
3803
- return this . parent . lookup ( name ) ;
3804
- }
3805
3784
}
3806
3785
3807
3786
/** A resolved instance field. */
@@ -3912,11 +3891,6 @@ export class PropertyPrototype extends DeclaredElement {
3912
3891
this . flags &= ~ ( CommonFlags . GET | CommonFlags . SET ) ;
3913
3892
}
3914
3893
3915
- /* @override */
3916
- lookup ( name : string ) : Element | null {
3917
- return this . parent . lookup ( name ) ;
3918
- }
3919
-
3920
3894
/** Tests if this prototype is bound to a class. */
3921
3895
get isBound ( ) : bool {
3922
3896
switch ( this . parent . kind ) {
@@ -3992,11 +3966,6 @@ export class Property extends VariableLikeElement {
3992
3966
registerConcreteElement ( this . program , this ) ;
3993
3967
}
3994
3968
}
3995
-
3996
- /* @override */
3997
- lookup ( name : string ) : Element | null {
3998
- return this . parent . lookup ( name ) ;
3999
- }
4000
3969
}
4001
3970
4002
3971
/** A resolved index signature. */
@@ -4026,11 +3995,6 @@ export class IndexSignature extends TypedElement {
4026
3995
getSetterInstance ( isUnchecked : bool ) : Function | null {
4027
3996
return ( < Class > this . parent ) . lookupOverload ( OperatorKind . INDEXED_SET , isUnchecked ) ;
4028
3997
}
4029
-
4030
- /* @override */
4031
- lookup ( name : string ) : Element | null {
4032
- return this . parent . lookup ( name ) ;
4033
- }
4034
3998
}
4035
3999
4036
4000
/** A yet unresolved class prototype. */
@@ -4155,11 +4119,6 @@ export class ClassPrototype extends DeclaredElement {
4155
4119
else assert ( ! instances . has ( instanceKey ) ) ;
4156
4120
instances . set ( instanceKey , instance ) ;
4157
4121
}
4158
-
4159
- /* @override */
4160
- lookup ( name : string ) : Element | null {
4161
- return this . parent . lookup ( name ) ;
4162
- }
4163
4122
}
4164
4123
4165
4124
/** A resolved class. */
@@ -4211,7 +4170,7 @@ export class Class extends TypedElement {
4211
4170
/** Tests if this class is array-like. */
4212
4171
get isArrayLike ( ) : bool {
4213
4172
if ( this . isBuiltinArray ) return true ;
4214
- var lengthField = this . lookupInSelf ( "length" ) ;
4173
+ var lengthField = this . getMember ( "length" ) ;
4215
4174
return lengthField !== null && (
4216
4175
lengthField . kind == ElementKind . FIELD ||
4217
4176
(
@@ -4361,30 +4320,20 @@ export class Class extends TypedElement {
4361
4320
return null ;
4362
4321
}
4363
4322
4364
- /* @override */
4365
- lookup ( name : string ) : Element | null {
4366
- return this . parent . lookup ( name ) ;
4367
- }
4368
-
4369
4323
/** Gets the method of the specified name, resolved with the given type arguments. */
4370
4324
getMethod ( name : string , typeArguments : Type [ ] | null = null ) : Function | null {
4371
- var members = this . members ;
4372
- if ( members !== null && members . has ( name ) ) {
4373
- let bound = changetype < Element > ( members . get ( name ) ) ;
4374
- if ( bound . kind == ElementKind . FUNCTION_PROTOTYPE ) {
4375
- return this . program . resolver . resolveFunction ( < FunctionPrototype > bound , typeArguments ) ;
4376
- }
4325
+ var member = this . getMember ( name ) ;
4326
+ if ( member && member . kind == ElementKind . FUNCTION_PROTOTYPE ) {
4327
+ return this . program . resolver . resolveFunction ( < FunctionPrototype > member , typeArguments ) ;
4377
4328
}
4378
4329
return null ;
4379
4330
}
4380
4331
4381
4332
/** Calculates the memory offset of the specified field. */
4382
4333
offsetof ( fieldName : string ) : u32 {
4383
- var members = assert ( this . members ) ;
4384
- assert ( members . has ( fieldName ) ) ;
4385
- var field = < Element > members . get ( fieldName ) ;
4386
- assert ( field . kind == ElementKind . FIELD ) ;
4387
- return ( < Field > field ) . memoryOffset ;
4334
+ var member = assert ( this . getMember ( fieldName ) ) ;
4335
+ assert ( member . kind == ElementKind . FIELD ) ;
4336
+ return ( < Field > member ) . memoryOffset ;
4388
4337
}
4389
4338
4390
4339
/** Creates a buffer suitable to hold a runtime instance of this class. */
@@ -4404,9 +4353,9 @@ export class Class extends TypedElement {
4404
4353
4405
4354
/** Writes a field value to a buffer and returns the number of bytes written. */
4406
4355
writeField < T > ( name : string , value : T , buffer : Uint8Array , baseOffset : i32 = this . program . totalOverhead ) : i32 {
4407
- var element = this . lookupInSelf ( name ) ;
4408
- if ( element !== null && element . kind == ElementKind . FIELD ) {
4409
- let fieldInstance = < Field > element ;
4356
+ var member = this . getMember ( name ) ;
4357
+ if ( member !== null && member . kind == ElementKind . FIELD ) {
4358
+ let fieldInstance = < Field > member ;
4410
4359
let offset = baseOffset + fieldInstance . memoryOffset ;
4411
4360
let typeKind = fieldInstance . type . kind ;
4412
4361
switch ( typeKind ) {
0 commit comments