@@ -25,7 +25,8 @@ import {
25
25
DecoratorFlags ,
26
26
FieldPrototype ,
27
27
Field ,
28
- Global
28
+ Global ,
29
+ Flow
29
30
} from "./program" ;
30
31
31
32
import {
@@ -355,22 +356,26 @@ export class Resolver extends DiagnosticEmitter {
355
356
/** Resolves an identifier to the element it refers to. */
356
357
resolveIdentifier (
357
358
identifier : IdentifierExpression ,
359
+ flow : Flow | null ,
358
360
context : Element | null ,
359
361
reportMode : ReportMode = ReportMode . REPORT
360
362
) : Element | null {
361
363
var name = identifier . text ;
362
364
var element : Element | null ;
363
365
366
+ if ( flow ) {
367
+ let local = flow . lookupLocal ( name ) ;
368
+ if ( local ) {
369
+ this . currentThisExpression = null ;
370
+ this . currentElementExpression = null ;
371
+ return local ;
372
+ }
373
+ }
374
+
364
375
if ( context ) {
365
376
366
377
switch ( context . kind ) {
367
- case ElementKind . FUNCTION : { // search locals, use prototype
368
- element = ( < Function > context ) . flow . getScopedLocal ( name ) ;
369
- if ( element ) {
370
- this . currentThisExpression = null ;
371
- this . currentElementExpression = null ;
372
- return element ;
373
- }
378
+ case ElementKind . FUNCTION : { // use prototype
374
379
context = ( < Function > context ) . prototype . parent ;
375
380
break ;
376
381
}
@@ -433,13 +438,13 @@ export class Resolver extends DiagnosticEmitter {
433
438
/** Resolves a property access to the element it refers to. */
434
439
resolvePropertyAccess (
435
440
propertyAccess : PropertyAccessExpression ,
436
- contextualFunction : Function ,
441
+ flow : Flow ,
437
442
contextualType : Type ,
438
443
reportMode : ReportMode = ReportMode . REPORT
439
444
) : Element | null {
440
445
// start by resolving the lhs target (expression before the last dot)
441
446
var targetExpression = propertyAccess . expression ;
442
- var target = this . resolveExpression ( targetExpression , contextualFunction , contextualType , reportMode ) ; // reports
447
+ var target = this . resolveExpression ( targetExpression , flow , contextualType , reportMode ) ; // reports
443
448
if ( ! target ) return null ;
444
449
445
450
// at this point we know exactly what the target is, so look up the element within
@@ -565,12 +570,12 @@ export class Resolver extends DiagnosticEmitter {
565
570
566
571
resolveElementAccess (
567
572
elementAccess : ElementAccessExpression ,
568
- contextualFunction : Function ,
573
+ flow : Flow ,
569
574
contextualType : Type ,
570
575
reportMode : ReportMode = ReportMode . REPORT
571
576
) : Element | null {
572
577
var targetExpression = elementAccess . expression ;
573
- var target = this . resolveExpression ( targetExpression , contextualFunction , contextualType , reportMode ) ;
578
+ var target = this . resolveExpression ( targetExpression , flow , contextualType , reportMode ) ;
574
579
if ( ! target ) return null ;
575
580
switch ( target . kind ) {
576
581
case ElementKind . GLOBAL : if ( ! this . ensureResolvedLazyGlobal ( < Global > target , reportMode ) ) return null ;
@@ -685,7 +690,7 @@ export class Resolver extends DiagnosticEmitter {
685
690
686
691
resolveExpression (
687
692
expression : Expression ,
688
- contextualFunction : Function ,
693
+ flow : Flow ,
689
694
contextualType : Type = Type . void ,
690
695
reportMode : ReportMode = ReportMode . REPORT
691
696
) : Element | null {
@@ -697,14 +702,14 @@ export class Resolver extends DiagnosticEmitter {
697
702
if ( ( < AssertionExpression > expression ) . assertionKind == AssertionKind . NONNULL ) {
698
703
return this . resolveExpression (
699
704
( < AssertionExpression > expression ) . expression ,
700
- contextualFunction ,
705
+ flow ,
701
706
contextualType ,
702
707
reportMode
703
708
) ;
704
709
}
705
710
let type = this . resolveType (
706
711
assert ( ( < AssertionExpression > expression ) . toType ) ,
707
- contextualFunction . flow . contextualTypeArguments ,
712
+ flow . contextualTypeArguments ,
708
713
reportMode
709
714
) ;
710
715
if ( ! type ) return null ;
@@ -733,7 +738,7 @@ export class Resolver extends DiagnosticEmitter {
733
738
}
734
739
return this . resolveExpression (
735
740
operand ,
736
- contextualFunction ,
741
+ flow ,
737
742
contextualType ,
738
743
reportMode
739
744
) ;
@@ -743,7 +748,7 @@ export class Resolver extends DiagnosticEmitter {
743
748
case Token . MINUS_MINUS : {
744
749
return this . resolveExpression (
745
750
( < UnaryPrefixExpression > expression ) . operand ,
746
- contextualFunction ,
751
+ flow ,
747
752
contextualType ,
748
753
reportMode
749
754
) ;
@@ -754,7 +759,7 @@ export class Resolver extends DiagnosticEmitter {
754
759
case Token . TILDE : {
755
760
let resolvedOperand = this . resolveExpression (
756
761
( < UnaryPrefixExpression > expression ) . operand ,
757
- contextualFunction ,
762
+ flow ,
758
763
contextualType ,
759
764
reportMode
760
765
) ;
@@ -772,7 +777,7 @@ export class Resolver extends DiagnosticEmitter {
772
777
case Token . MINUS_MINUS : {
773
778
return this . resolveExpression (
774
779
( < UnaryPostfixExpression > expression ) . operand ,
775
- contextualFunction ,
780
+ flow ,
776
781
contextualType ,
777
782
reportMode
778
783
) ;
@@ -788,15 +793,15 @@ export class Resolver extends DiagnosticEmitter {
788
793
throw new Error ( "not implemented" ) ;
789
794
}
790
795
case NodeKind . THIS : { // -> Class / ClassPrototype
791
- if ( contextualFunction . flow . is ( FlowFlags . INLINE_CONTEXT ) ) {
792
- let explicitLocal = contextualFunction . flow . getScopedLocal ( "this" ) ;
796
+ if ( flow . is ( FlowFlags . INLINE_CONTEXT ) ) {
797
+ let explicitLocal = flow . lookupLocal ( "this" ) ;
793
798
if ( explicitLocal ) {
794
799
this . currentThisExpression = null ;
795
800
this . currentElementExpression = null ;
796
801
return explicitLocal ;
797
802
}
798
803
}
799
- let parent = contextualFunction . parent ;
804
+ let parent = flow . parentFunction . parent ;
800
805
if ( parent ) {
801
806
this . currentThisExpression = null ;
802
807
this . currentElementExpression = null ;
@@ -811,15 +816,15 @@ export class Resolver extends DiagnosticEmitter {
811
816
return null ;
812
817
}
813
818
case NodeKind . SUPER : { // -> Class
814
- if ( contextualFunction . flow . is ( FlowFlags . INLINE_CONTEXT ) ) {
815
- let explicitLocal = contextualFunction . flow . getScopedLocal ( "super" ) ;
819
+ if ( flow . is ( FlowFlags . INLINE_CONTEXT ) ) {
820
+ let explicitLocal = flow . lookupLocal ( "super" ) ;
816
821
if ( explicitLocal ) {
817
822
this . currentThisExpression = null ;
818
823
this . currentElementExpression = null ;
819
824
return explicitLocal ;
820
825
}
821
826
}
822
- let parent = contextualFunction . parent ;
827
+ let parent = flow . actualFunction . parent ;
823
828
if ( parent && parent . kind == ElementKind . CLASS && ( parent = ( < Class > parent ) . base ) ) {
824
829
this . currentThisExpression = null ;
825
830
this . currentElementExpression = null ;
@@ -834,7 +839,7 @@ export class Resolver extends DiagnosticEmitter {
834
839
return null ;
835
840
}
836
841
case NodeKind . IDENTIFIER : {
837
- return this . resolveIdentifier ( < IdentifierExpression > expression , contextualFunction , reportMode ) ;
842
+ return this . resolveIdentifier ( < IdentifierExpression > expression , flow , flow . actualFunction , reportMode ) ;
838
843
}
839
844
case NodeKind . LITERAL : {
840
845
switch ( ( < LiteralExpression > expression ) . literalKind ) {
@@ -871,28 +876,28 @@ export class Resolver extends DiagnosticEmitter {
871
876
case NodeKind . PROPERTYACCESS : {
872
877
return this . resolvePropertyAccess (
873
878
< PropertyAccessExpression > expression ,
874
- contextualFunction ,
879
+ flow ,
875
880
contextualType ,
876
881
reportMode
877
882
) ;
878
883
}
879
884
case NodeKind . ELEMENTACCESS : {
880
885
return this . resolveElementAccess (
881
886
< ElementAccessExpression > expression ,
882
- contextualFunction ,
887
+ flow ,
883
888
contextualType ,
884
889
reportMode
885
890
) ;
886
891
}
887
892
case NodeKind . CALL : {
888
893
let targetExpression = ( < CallExpression > expression ) . expression ;
889
- let target = this . resolveExpression ( targetExpression , contextualFunction , contextualType , reportMode ) ;
894
+ let target = this . resolveExpression ( targetExpression , flow , contextualType , reportMode ) ;
890
895
if ( ! target ) return null ;
891
896
if ( target . kind == ElementKind . FUNCTION_PROTOTYPE ) {
892
897
let instance = this . resolveFunctionInclTypeArguments (
893
898
< FunctionPrototype > target ,
894
899
( < CallExpression > expression ) . typeArguments ,
895
- makeMap < string , Type > ( contextualFunction . flow . contextualTypeArguments ) ,
900
+ makeMap < string , Type > ( flow . contextualTypeArguments ) ,
896
901
expression ,
897
902
reportMode
898
903
) ;
0 commit comments