Browse Source

fix: codeframe marker should have min width of 1

Evan You 6 years ago
parent
commit
02c6d5c4e3
2 changed files with 5 additions and 7 deletions
  1. 1 2
      packages/compiler-core/src/index.ts
  2. 4 5
      packages/shared/src/codeframe.ts

+ 1 - 2
packages/compiler-core/src/index.ts

@@ -36,7 +36,6 @@ import { generateCodeFrame as _genCodeFrame } from '@vue/shared'
 const generateCodeFrame = _genCodeFrame as (
   source: string,
   start?: number,
-  end?: number,
-  lineOffset?: number
+  end?: number
 ) => string
 export { generateCodeFrame }

+ 4 - 5
packages/shared/src/codeframe.ts

@@ -3,8 +3,7 @@ const range: number = 2
 export function generateCodeFrame(
   source: string,
   start = 0,
-  end = source.length,
-  lineOffset = 0
+  end = source.length
 ): string {
   const lines = source.split(/\r?\n/)
   let count = 0
@@ -14,20 +13,20 @@ export function generateCodeFrame(
     if (count >= start) {
       for (let j = i - range; j <= i + range || end > count; j++) {
         if (j < 0 || j >= lines.length) continue
-        const line = j + 1 + lineOffset
+        const line = j + 1
         res.push(`${line}${' '.repeat(3 - String(line).length)}|  ${lines[j]}`)
         const lineLength = lines[j].length
         if (j === i) {
           // push underline
           const pad = start - (count - lineLength) + 1
           const length = Math.max(
-            0,
+            1,
             end > count ? lineLength - pad : end - start
           )
           res.push(`   |  ` + ' '.repeat(pad) + '^'.repeat(length))
         } else if (j > i) {
           if (end > count) {
-            const length = Math.min(end - count, lineLength)
+            const length = Math.max(Math.min(end - count, lineLength), 1)
             res.push(`   |  ` + '^'.repeat(length))
           }
           count += lineLength + 1