@@ -20,13 +20,16 @@ export function pluckModuleFunction<F: Function> (
2020 : [ ]
2121}
2222
23- export function addProp ( el : ASTElement , name : string , value : string , range ? : Range ) {
24- ( el . props || ( el . props = [ ] ) ) . push ( rangeSetItem ( { name, value } , range ) )
23+ export function addProp ( el : ASTElement , name : string , value : string , range ? : Range , dynamic ? : boolean ) {
24+ ( el . props || ( el . props = [ ] ) ) . push ( rangeSetItem ( { name, value, dynamic } , range ) )
2525 el . plain = false
2626}
2727
28- export function addAttr ( el : ASTElement , name : string , value : any , range ?: Range ) {
29- ( el . attrs || ( el . attrs = [ ] ) ) . push ( rangeSetItem ( { name, value } , range ) )
28+ export function addAttr ( el : ASTElement , name : string , value : any , range ?: Range , dynamic ?: boolean ) {
29+ const attrs = dynamic
30+ ? ( el . dynamicAttrs || ( el . dynamicAttrs = [ ] ) )
31+ : ( el . attrs || ( el . attrs = [ ] ) )
32+ attrs . push ( rangeSetItem ( { name, value, dynamic } , range ) )
3033 el . plain = false
3134}
3235
@@ -42,21 +45,36 @@ export function addDirective (
4245 rawName : string ,
4346 value : string ,
4447 arg : ?string ,
48+ isDynamicArg : boolean ,
4549 modifiers : ?ASTModifiers ,
4650 range ?: Range
4751) {
48- ( el . directives || ( el . directives = [ ] ) ) . push ( rangeSetItem ( { name, rawName, value, arg, modifiers } , range ) )
52+ ( el . directives || ( el . directives = [ ] ) ) . push ( rangeSetItem ( {
53+ name,
54+ rawName,
55+ value,
56+ arg,
57+ isDynamicArg,
58+ modifiers
59+ } , range ) )
4960 el . plain = false
5061}
5162
63+ function prependModifierMarker ( symbol : string , name : string , dynamic ?: boolean ) : string {
64+ return dynamic
65+ ? `_p(${ name } ,"${ symbol } ")`
66+ : symbol + name // mark the event as captured
67+ }
68+
5269export function addHandler (
5370 el : ASTElement ,
5471 name : string ,
5572 value : string ,
5673 modifiers : ?ASTModifiers ,
5774 important ?: boolean ,
5875 warn ?: ?Function ,
59- range ?: Range
76+ range ?: Range ,
77+ dynamic ?: boolean
6078) {
6179 modifiers = modifiers || emptyObject
6280 // warn prevent and passive modifier
@@ -75,28 +93,34 @@ export function addHandler (
7593 // normalize click.right and click.middle since they don't actually fire
7694 // this is technically browser-specific, but at least for now browsers are
7795 // the only target envs that have right/middle clicks.
78- if ( name === 'click' ) {
79- if ( modifiers . right ) {
96+ if ( modifiers . right ) {
97+ if ( dynamic ) {
98+ name = `( $ { name} ) === 'click' ?'contextmenu' :( $ { name} ) `
99+ } else if (name === 'click') {
80100 name = 'contextmenu'
81101 delete modifiers.right
82- } else if ( modifiers . middle ) {
102+ }
103+ } else if (modifiers.middle) {
104+ if (dynamic) {
105+ name = ` ( $ { name} ) === 'click' ?'mouseup' :( $ { name} ) `
106+ } else if ( name === 'click' ) {
83107 name = 'mouseup '
84108 }
85109 }
86110
87111 // check capture modifier
88112 if ( modifiers . capture ) {
89113 delete modifiers . capture
90- name = '!' + name // mark the event as captured
114+ name = prependModifierMarker ( '!' , name , dynamic )
91115 }
92116 if ( modifiers . once ) {
93117 delete modifiers . once
94- name = '~' + name // mark the event as once
118+ name = prependModifierMarker ( '~' , name , dynamic )
95119 }
96120 /* istanbul ignore if */
97121 if ( modifiers . passive ) {
98122 delete modifiers . passive
99- name = '&' + name // mark the event as passive
123+ name = prependModifierMarker ( '&' , name , dynamic )
100124 }
101125
102126 let events
@@ -107,7 +131,7 @@ export function addHandler (
107131 events = el . events || ( el . events = { } )
108132 }
109133
110- const newHandler : any = rangeSetItem ( { value : value . trim ( ) } , range )
134+ const newHandler : any = rangeSetItem ( { value : value . trim ( ) , dynamic } , range )
111135 if ( modifiers !== emptyObject ) {
112136 newHandler . modifiers = modifiers
113137 }
0 commit comments