]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: drop class opt for now + move lazy requires to utils
authorEvan You <yyx990803@gmail.com>
Mon, 30 Sep 2019 17:13:32 +0000 (13:13 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 30 Sep 2019 18:52:10 +0000 (14:52 -0400)
packages/compiler-core/src/transforms/transformElement.ts
packages/compiler-core/src/transforms/transformExpression.ts
packages/compiler-core/src/utils.ts

index edfddca60635babdcb97742116e90ba7a540d124..0f36d9fad6983103b3d94ccf0eacb55cec68a122 100644 (file)
@@ -268,10 +268,8 @@ function dedupeProperties(properties: Property[]): Property[] {
     const name = prop.key.content
     const existing = knownProps[name]
     if (existing) {
-      if (name.startsWith('on') || name === 'style') {
+      if (name.startsWith('on') || name === 'style' || name === 'class') {
         mergeAsArray(existing, prop)
-      } else if (name === 'class') {
-        mergeClasses(existing, prop)
       }
       // unexpected duplicate, should have emitted error during parse
     } else {
@@ -293,13 +291,6 @@ function mergeAsArray(existing: Property, incoming: Property) {
   }
 }
 
-// Merge dynamic and static class into a single prop
-// :class="expression" class="string"
-// -> class: expression + "string"
-function mergeClasses(existing: Property, incoming: Property) {
-  // TODO
-}
-
 function createDirectiveArgs(
   dir: DirectiveNode,
   context: TransformContext
index b69f8caac78d51ce0bff085a66d3e400b90bd656..439fa19b2bf411200b12e12c1e0f5c156e0403ba 100644 (file)
@@ -7,9 +7,6 @@
 // - This transform is only applied in non-browser builds because it relies on
 //   an additional JavaScript parser. In the browser, there is no source-map
 //   support and the code is wrapped in `with (this) { ... }`.
-
-import { parseScript } from 'meriyah'
-import { walk } from 'estree-walker'
 import { NodeTransform, TransformContext } from '../transform'
 import {
   NodeTypes,
@@ -20,7 +17,12 @@ import {
   createCompoundExpression
 } from '../ast'
 import { Node, Function, Identifier, Property } from 'estree'
-import { advancePositionWithClone, isSimpleIdentifier } from '../utils'
+import {
+  advancePositionWithClone,
+  isSimpleIdentifier,
+  parseJS,
+  walkJS
+} from '../utils'
 
 export const transformExpression: NodeTransform = (node, context) => {
   if (node.type === NodeTypes.INTERPOLATION) {
@@ -39,22 +41,13 @@ export const transformExpression: NodeTransform = (node, context) => {
           dir.exp = processExpression(exp, context, dir.name === 'slot')
         }
         if (arg && !arg.isStatic) {
-          if (dir.name === 'class') {
-            // TODO special expression optimization for classes
-            dir.arg = processExpression(arg, context)
-          } else {
-            dir.arg = processExpression(arg, context)
-          }
+          dir.arg = processExpression(arg, context)
         }
       }
     }
   }
 }
 
-// cache node requires
-let _parseScript: typeof parseScript
-let _walk: typeof walk
-
 interface PrefixMeta {
   prefix?: string
   start: number
@@ -83,18 +76,12 @@ export function processExpression(
     return node
   }
 
-  // lazy require dependencies so that they don't end up in rollup's dep graph
-  // and thus can be tree-shaken in browser builds.
-  const parseScript =
-    _parseScript || (_parseScript = require('meriyah').parseScript)
-  const walk = _walk || (_walk = require('estree-walker').walk)
-
   let ast: any
   // if the expression is supposed to be used in a function params position
   // we need to parse it differently.
   const source = `(${node.content})${asParams ? `=>{}` : ``}`
   try {
-    ast = parseScript(source, { ranges: true })
+    ast = parseJS(source, { ranges: true })
   } catch (e) {
     context.onError(e)
     return node
@@ -104,7 +91,7 @@ export function processExpression(
   const knownIds = Object.create(context.identifiers)
 
   // walk the AST and look for identifiers that need to be prefixed with `_ctx.`.
-  walk(ast, {
+  walkJS(ast, {
     enter(node: Node & PrefixMeta, parent) {
       if (node.type === 'Identifier') {
         if (!ids.includes(node)) {
@@ -126,7 +113,7 @@ export function processExpression(
         // walk function expressions and add its arguments to known identifiers
         // so that we don't prefix them
         node.params.forEach(p =>
-          walk(p, {
+          walkJS(p, {
             enter(child, parent) {
               if (
                 child.type === 'Identifier' &&
@@ -182,21 +169,24 @@ export function processExpression(
   const children: CompoundExpressionNode['children'] = []
   ids.sort((a, b) => a.start - b.start)
   ids.forEach((id, i) => {
+    // range is offset by -1 due to the wrapping parens when parsed
+    const start = id.start - 1
+    const end = id.end - 1
     const last = ids[i - 1] as any
-    const leadingText = full.slice(last ? last.end - 1 : 0, id.start - 1)
+    const leadingText = full.slice(last ? last.end - 1 : 0, start)
     if (leadingText.length || id.prefix) {
       children.push(leadingText + (id.prefix || ``))
     }
-    const source = full.slice(id.start - 1, id.end - 1)
+    const source = full.slice(start, end)
     children.push(
       createSimpleExpression(id.name, false, {
         source,
-        start: advancePositionWithClone(node.loc.start, source, id.start - 1),
-        end: advancePositionWithClone(node.loc.start, source, id.end - 1)
+        start: advancePositionWithClone(node.loc.start, source, start),
+        end: advancePositionWithClone(node.loc.start, source, end)
       })
     )
-    if (i === ids.length - 1 && id.end - 1 < full.length) {
-      children.push(full.slice(id.end - 1))
+    if (i === ids.length - 1 && end < full.length) {
+      children.push(full.slice(end))
     }
   })
 
index 2745b041ca181f0db8c7dab25d0e61e86a59a860..f0c95c73de1d4149077ac4999671a768c57b0340 100644 (file)
@@ -1,4 +1,30 @@
 import { SourceLocation, Position } from './ast'
+import { parseScript } from 'meriyah'
+import { walk } from 'estree-walker'
+
+// cache node requires
+// lazy require dependencies so that they don't end up in rollup's dep graph
+// and thus can be tree-shaken in browser builds.
+let _parseScript: typeof parseScript
+let _walk: typeof walk
+
+export const parseJS: typeof parseScript = (code: string, options: any) => {
+  assert(
+    !__BROWSER__,
+    `Expression AST analysis can only be performed in non-browser builds.`
+  )
+  const parse = _parseScript || (_parseScript = require('meriyah').parseScript)
+  return parse(code, options)
+}
+
+export const walkJS: typeof walk = (ast, walker) => {
+  assert(
+    !__BROWSER__,
+    `Expression AST analysis can only be performed in non-browser builds.`
+  )
+  const walk = _walk || (_walk = require('estree-walker').walk)
+  return walk(ast, walker)
+}
 
 export const isSimpleIdentifier = (name: string): boolean =>
   !/^\d|[^\w]/.test(name)