]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: relay compiler-core warnings in compiler-sfc with codeframe
authorEvan You <yyx990803@gmail.com>
Wed, 5 May 2021 18:24:46 +0000 (14:24 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 5 May 2021 18:24:46 +0000 (14:24 -0400)
packages/compiler-sfc/src/compileTemplate.ts

index 45fb36b7fb7914b9789e6e126c2d97d9003cd208..9fa099a30793d1242b634fab3a425c3664ffe29b 100644 (file)
@@ -18,7 +18,7 @@ import {
   transformSrcset,
   createSrcsetTransformWithOptions
 } from './templateTransformSrcset'
-import { isObject } from '@vue/shared'
+import { generateCodeFrame, isObject } from '@vue/shared'
 import * as CompilerDOM from '@vue/compiler-dom'
 import * as CompilerSSR from '@vue/compiler-ssr'
 import consolidate from 'consolidate'
@@ -170,6 +170,7 @@ function doCompileTemplate({
   transformAssetUrls
 }: SFCTemplateCompileOptions): SFCTemplateCompileResults {
   const errors: CompilerError[] = []
+  const warnings: CompilerError[] = []
 
   let nodeTransforms: NodeTransform[] = []
   if (isObject(transformAssetUrls)) {
@@ -211,7 +212,8 @@ function doCompileTemplate({
     nodeTransforms: nodeTransforms.concat(compilerOptions.nodeTransforms || []),
     filename,
     sourceMap: true,
-    onError: e => errors.push(e)
+    onError: e => errors.push(e),
+    onWarn: w => warnings.push(w)
   })
 
   // inMap should be the map produced by ./parse.ts which is a simple line-only
@@ -226,7 +228,19 @@ function doCompileTemplate({
     }
   }
 
-  return { code, ast, preamble, source, errors, tips: [], map }
+  const tips = warnings.map(w => {
+    let msg = w.message
+    if (w.loc) {
+      msg += `\n${generateCodeFrame(
+        source,
+        w.loc.start.offset,
+        w.loc.end.offset
+      )}`
+    }
+    return msg
+  })
+
+  return { code, ast, preamble, source, errors, tips, map }
 }
 
 function mapLines(oldMap: RawSourceMap, newMap: RawSourceMap): RawSourceMap {