diff --git a/package.json b/package.json
index c47fc2a1..fca2a8ca 100644
--- a/package.json
+++ b/package.json
@@ -76,8 +76,7 @@
     "test:mocha": "mocha --require ts-node/register \"test/*.js\" --reporter dot --timeout 60000",
     "test:cover": "nyc mocha \"test/*.js\" --reporter dot --timeout 60000",
     "test:debug": "mocha --require ts-node/register/transpile-only \"test/*.js\" --reporter dot --timeout 60000",
-    "preupdate-fixtures": "npm run -s build",
-    "update-fixtures": "node scripts/update-fixtures-ast.js && node scripts/update-fixtures-document-fragment.js",
+    "update-fixtures": "ts-node --transpile-only scripts/update-fixtures-ast.js && ts-node --transpile-only scripts/update-fixtures-document-fragment.js",
     "preversion": "npm test",
     "version": "npm run -s build",
     "postversion": "git push && git push --tags",
diff --git a/scripts/update-fixtures-ast.js b/scripts/update-fixtures-ast.js
index 23aa1c56..89905747 100644
--- a/scripts/update-fixtures-ast.js
+++ b/scripts/update-fixtures-ast.js
@@ -11,7 +11,7 @@
 
 const fs = require("fs")
 const path = require("path")
-const parser = require("../")
+const parser = require("../src")
 const escope = require("eslint-scope")
 const semver = require("semver")
 
@@ -222,16 +222,17 @@ for (const name of TARGETS) {
         continue
     }
     const sourcePath = path.join(ROOT, `${name}/source.vue`)
-    const optionsPath = path.join(ROOT, `${name}/parser-options.json`)
+    const optionsPath = [
+        path.join(ROOT, `${name}/parser-options.json`),
+        path.join(ROOT, `${name}/parser-options.js`),
+    ].find((fp) => fs.existsSync(fp))
     const astPath = path.join(ROOT, `${name}/ast.json`)
     const tokenRangesPath = path.join(ROOT, `${name}/token-ranges.json`)
     const treePath = path.join(ROOT, `${name}/tree.json`)
     const scopePath = path.join(ROOT, `${name}/scope.json`)
     const servicesPath = path.join(ROOT, `${name}/services.json`)
     const source = fs.readFileSync(sourcePath, "utf8")
-    const parserOptions = fs.existsSync(optionsPath)
-        ? JSON.parse(fs.readFileSync(optionsPath, "utf8"))
-        : {}
+    const parserOptions = optionsPath ? require(optionsPath) : {}
     const options = Object.assign(
         { filePath: sourcePath },
         PARSER_OPTIONS,
diff --git a/scripts/update-fixtures-document-fragment.js b/scripts/update-fixtures-document-fragment.js
index 605c3d45..ef8c4110 100644
--- a/scripts/update-fixtures-document-fragment.js
+++ b/scripts/update-fixtures-document-fragment.js
@@ -6,7 +6,7 @@
 
 const fs = require("fs")
 const path = require("path")
-const parser = require("../")
+const parser = require("../src")
 
 //------------------------------------------------------------------------------
 // Helpers
@@ -53,14 +53,15 @@ for (const name of TARGETS) {
         .readdirSync(path.join(ROOT, name))
         .find((f) => f.startsWith("source."))
     const sourcePath = path.join(ROOT, `${name}/${sourceFileName}`)
-    const optionsPath = path.join(ROOT, `${name}/parser-options.json`)
+    const optionsPath = [
+        path.join(ROOT, `${name}/parser-options.json`),
+        path.join(ROOT, `${name}/parser-options.js`),
+    ].find((fp) => fs.existsSync(fp))
     const source = fs.readFileSync(sourcePath, "utf8")
     const options = Object.assign(
         { filePath: sourcePath },
         PARSER_OPTIONS,
-        fs.existsSync(optionsPath)
-            ? JSON.parse(fs.readFileSync(optionsPath, "utf8"))
-            : {}
+        optionsPath ? require(optionsPath) : {},
     )
     const result = parser.parseForESLint(source, options)
     const actual = result.services.getDocumentFragment()
@@ -72,7 +73,7 @@ for (const name of TARGETS) {
     console.log("Update:", name)
 
     const tokenRanges = getAllTokens(actual).map((t) =>
-        source.slice(t.range[0], t.range[1])
+        source.slice(t.range[0], t.range[1]),
     )
     const tree = getTree(source, actual)
 
@@ -106,7 +107,7 @@ function getTree(source, fgAst) {
                     type: node.type,
                     text: source.slice(node.range[0], node.range[1]),
                     children: [],
-                })
+                }),
             )
         },
         leaveNode() {
diff --git a/src/ast/nodes.ts b/src/ast/nodes.ts
index 104255fe..090f8573 100644
--- a/src/ast/nodes.ts
+++ b/src/ast/nodes.ts
@@ -7,6 +7,8 @@ import type { ScopeManager } from "eslint-scope"
 import type { ParseError } from "./errors"
 import type { HasLocation } from "./locations"
 import type { Token } from "./tokens"
+// eslint-disable-next-line node/no-extraneous-import -- ignore
+import type { TSESTree } from "@typescript-eslint/utils"
 
 //------------------------------------------------------------------------------
 // Common
@@ -28,6 +30,7 @@ export type Node =
     | VForExpression
     | VOnExpression
     | VSlotScopeExpression
+    | VGenericExpression
     | VFilterSequenceExpression
     | VFilter
 
@@ -742,7 +745,7 @@ export type Namespace =
  */
 export interface Variable {
     id: ESLintIdentifier
-    kind: "v-for" | "scope"
+    kind: "v-for" | "scope" | "generic"
     references: Reference[]
 }
 
@@ -787,6 +790,16 @@ export interface VSlotScopeExpression extends HasLocation, HasParent {
     params: ESLintPattern[]
 }
 
+/**
+ * The node of `generic` directives.
+ */
+export interface VGenericExpression extends HasLocation, HasParent {
+    type: "VGenericExpression"
+    parent: VExpressionContainer
+    params: TSESTree.TSTypeParameterDeclaration["params"]
+    rawParams: string[]
+}
+
 /**
  * The node of a filter sequence which is separated by `|`.
  */
@@ -845,6 +858,7 @@ export interface VExpressionContainer extends HasLocation, HasParent {
         | VForExpression
         | VOnExpression
         | VSlotScopeExpression
+        | VGenericExpression
         | null
     references: Reference[]
 }
diff --git a/src/common/ast-utils.ts b/src/common/ast-utils.ts
index a97a1970..e87b8365 100644
--- a/src/common/ast-utils.ts
+++ b/src/common/ast-utils.ts
@@ -3,6 +3,8 @@ import type {
     VDirective,
     VDocumentFragment,
     VElement,
+    VExpressionContainer,
+    VGenericExpression,
     VNode,
 } from "../ast"
 
@@ -80,3 +82,34 @@ export function getLang(element: VElement | undefined): string | null {
     const lang = langAttr && langAttr.value && langAttr.value.value
     return lang || null
 }
+/**
+ * Check whether the given script element has `lang="ts"`.
+ * @param element The element to check.
+ * @returns The given script element has `lang="ts"`.
+ */
+export function isTSLang(element: VElement | undefined): boolean {
+    const lang = getLang(element)
+    // See https://github.com/vuejs/core/blob/28e30c819df5e4fc301c98f7be938fa13e8be3bc/packages/compiler-sfc/src/compileScript.ts#L179
+    return lang === "ts" || lang === "tsx"
+}
+
+export type GenericDirective = VDirective & {
+    value: VExpressionContainer & {
+        expression: VGenericExpression
+    }
+}
+
+/**
+ * Find `generic` directive from given `<script>` element
+ */
+export function findGenericDirective(
+    element: VElement,
+): GenericDirective | null {
+    return (
+        element.startTag.attributes.find(
+            (attr): attr is GenericDirective =>
+                attr.directive &&
+                attr.value?.expression?.type === "VGenericExpression",
+        ) || null
+    )
+}
diff --git a/src/html/parser.ts b/src/html/parser.ts
index 5d66ca16..9a6c1bef 100644
--- a/src/html/parser.ts
+++ b/src/html/parser.ts
@@ -58,6 +58,7 @@ import type {
     CustomTemplateTokenizer,
     CustomTemplateTokenizerConstructor,
 } from "./custom-tokenizer"
+import { isScriptSetupElement, isTSLang } from "../common/ast-utils"
 
 const DIRECTIVE_NAME = /^(?:v-|[.:@#]).*[^.:@#]$/u
 const DT_DD = /^d[dt]$/u
@@ -178,8 +179,10 @@ export class Parser {
     private document: VDocumentFragment
     private elementStack: VElement[]
     private vPreElement: VElement | null
-    private postProcessesForScript: ((parserOptions: ParserOptions) => void)[] =
-        []
+    private postProcessesForScript: ((
+        htmlParserOptions: ParserOptions,
+        scriptParserOptions: ParserOptions,
+    ) => void)[] = []
 
     /**
      * The source code text.
@@ -290,7 +293,7 @@ export class Parser {
 
         const doc = this.document
 
-        const parserOptions = {
+        const htmlParserOptions = {
             ...this.baseParserOptions,
             parser: getScriptParser(
                 this.baseParserOptions.parser,
@@ -300,8 +303,14 @@ export class Parser {
                 },
             ),
         }
+        const scriptParserOptions = {
+            ...this.baseParserOptions,
+            parser: getScriptParser(this.baseParserOptions.parser, () =>
+                getParserLangFromSFC(doc),
+            ),
+        }
         for (const proc of this.postProcessesForScript) {
-            proc(parserOptions)
+            proc(htmlParserOptions, scriptParserOptions)
         }
         this.postProcessesForScript = []
 
@@ -449,24 +458,18 @@ export class Parser {
      * @param namespace The current namespace.
      */
     private processAttribute(node: VAttribute, namespace: Namespace): void {
-        const tagName = this.getTagName(node.parent.parent)
-        const attrName = this.getTagName(node.key)
-
-        if (
-            (this.expressionEnabled ||
-                (attrName === "v-pre" && !this.isInVPreElement)) &&
-            (DIRECTIVE_NAME.test(attrName) ||
-                attrName === "slot-scope" ||
-                (tagName === "template" && attrName === "scope"))
-        ) {
-            this.postProcessesForScript.push((parserOptions) => {
-                convertToDirective(
-                    this.text,
-                    parserOptions,
-                    this.locationCalculator,
-                    node,
-                )
-            })
+        if (this.needConvertToDirective(node)) {
+            this.postProcessesForScript.push(
+                (parserOptions, scriptParserOptions) => {
+                    convertToDirective(
+                        this.text,
+                        parserOptions,
+                        scriptParserOptions,
+                        this.locationCalculator,
+                        node,
+                    )
+                },
+            )
             return
         }
 
@@ -480,6 +483,35 @@ export class Parser {
             this.reportParseError(node, "x-invalid-namespace")
         }
     }
+    /**
+     * Checks whether the given attribute node is need convert to directive.
+     * @param node The node to check
+     */
+    private needConvertToDirective(node: VAttribute) {
+        const element = node.parent.parent
+        const tagName = this.getTagName(element)
+        const attrName = this.getTagName(node.key)
+
+        if (
+            attrName === "generic" &&
+            element.parent.type === "VDocumentFragment" &&
+            isScriptSetupElement(element) &&
+            isTSLang(element)
+        ) {
+            return true
+        }
+        const expressionEnabled =
+            this.expressionEnabled ||
+            (attrName === "v-pre" && !this.isInVPreElement)
+        if (!expressionEnabled) {
+            return false
+        }
+        return (
+            DIRECTIVE_NAME.test(attrName) ||
+            attrName === "slot-scope" ||
+            (tagName === "template" && attrName === "scope")
+        )
+    }
 
     /**
      * Process the given template text token with a configured template tokenizer, based on language.
diff --git a/src/script-setup/index.ts b/src/script-setup/index.ts
index c9321b22..e820bdcf 100644
--- a/src/script-setup/index.ts
+++ b/src/script-setup/index.ts
@@ -5,6 +5,7 @@
 import type { ScopeManager, Scope } from "eslint-scope"
 import type {
     ESLintBlockStatement,
+    ESLintExportNamedDeclaration,
     ESLintExportSpecifier,
     ESLintExtendedProgram,
     ESLintIdentifier,
@@ -26,6 +27,7 @@ import type { LinesAndColumns } from "../common/lines-and-columns"
 import type { LocationCalculator } from "../common/location-calculator"
 import type { ParserOptions } from "../common/parser-options"
 import { parseScript as parseScriptBase, parseScriptFragment } from "../script"
+import { extractGeneric } from "../script/generic"
 import { getScriptSetupParserOptions } from "./parser-options"
 
 type RemapBlock = {
@@ -53,7 +55,7 @@ class CodeBlocks {
     }
     public append(codeLet: string, originalOffset: number) {
         const rangeStart = this.code.length
-        this.code += codeLet.trimRight()
+        this.code += codeLet.trimEnd()
         this.remapBlocks.push({
             range: [rangeStart, this.code.length],
             offset: originalOffset - rangeStart,
@@ -152,10 +154,17 @@ class RestoreASTCallbacks {
     }
 }
 
+type Postprocess = (
+    result: ESLintExtendedProgram,
+    context: { scriptSetupBlockRange: [number, number] },
+) => void
+
 type ScriptSetupCodeBlocks = {
     codeBlocks: CodeBlocks
     // The location of the code of the statements in `<script setup>`.
     scriptSetupBlockRange: [number, number]
+    // Post process
+    postprocess: Postprocess
     // Used to restore ExportNamedDeclaration.
     restoreASTCallbacks: RestoreASTCallbacks
 }
@@ -164,13 +173,14 @@ type ScriptSetupModuleCodeBlocks =
     | {
           codeBlocks: CodeBlocks
           scriptSetupBlockRange?: undefined
+          postprocess?: undefined
           restoreASTCallbacks?: undefined
       }
 
 function parseScript(
     code: string,
     parserOptions: ParserOptions,
-    locationCalculator: LocationCalculator,
+    locationCalculatorForError: LocationCalculator,
 ) {
     try {
         return parseScriptBase(code, parserOptions)
@@ -178,7 +188,7 @@ function parseScript(
         const perr = ParseError.normalize(err)
         if (perr) {
             // console.log(code)
-            fixErrorLocation(perr, locationCalculator)
+            fixErrorLocation(perr, locationCalculatorForError)
             throw perr
         }
         throw err
@@ -225,8 +235,10 @@ export function parseScriptSetupElements(
         getFixOffset(offset, kind) {
             const test: (block: RemapBlock) => boolean =
                 kind === "start"
-                    ? (block) => offset < block.range[1]
-                    : (block) => offset <= block.range[1]
+                    ? (block) =>
+                          block.range[0] <= offset && offset < block.range[1]
+                    : (block) =>
+                          block.range[0] < offset && offset <= block.range[1]
 
             for (const block of scriptSetupModuleCodeBlocks.codeBlocks
                 .remapBlocks) {
@@ -244,6 +256,12 @@ export function parseScriptSetupElements(
         parserOptions,
         locationCalculator,
     )
+    if (scriptSetupModuleCodeBlocks.postprocess) {
+        scriptSetupModuleCodeBlocks.postprocess(result, {
+            scriptSetupBlockRange:
+                scriptSetupModuleCodeBlocks.scriptSetupBlockRange,
+        })
+    }
 
     /* Remap ASTs */
     const scriptSetupStatements = remapAST(result, scriptSetupModuleCodeBlocks)
@@ -465,6 +483,7 @@ function getScriptSetupModuleCodeBlocks(
             scriptSetupCodeBlocks.scriptSetupBlockRange[0] + scriptSetupOffset,
             scriptSetupCodeBlocks.scriptSetupBlockRange[1] + scriptSetupOffset,
         ],
+        postprocess: scriptSetupCodeBlocks.postprocess,
         restoreASTCallbacks: scriptSetupCodeBlocks.restoreASTCallbacks,
     }
 }
@@ -514,41 +533,186 @@ function getScriptSetupCodeBlocks(
     // It holds the information to restore the transformation source code of the export statements held in `statementCodeBlocks`.
     const restoreASTCallbacks = new RestoreASTCallbacks()
 
-    let astOffset = 0
+    let usedOffset = 0
 
     /**
-     * Append the given range of code to the given codeBlocks.
+     * Consume and append the given range of code to the given codeBlocks.
      */
-    function processAppend(codeBlocks: CodeBlocks, start: number, end: number) {
+    function append(codeBlocks: CodeBlocks, start: number, end: number) {
         if (start < end) {
             codeBlocks.append(
                 scriptCode.slice(start, end),
                 scriptSetupStartOffset + start,
             )
-            astOffset = end
-        }
-    }
-
-    /**
-     * Append the partial statements up to the start position to `statementCodeBlocks`.
-     */
-    function processStatementCodeBlock(start: number) {
-        if (astOffset < start) {
-            processAppend(statementCodeBlocks, astOffset, start)
-            statementCodeBlocks.appendSplitPunctuators(";")
+            usedOffset = end
+            return true
         }
+        return false
     }
 
     /**
      * Append the given range of import or export statement to the given codeBlocks.
      */
-    function processModuleCodeBlock(
+    function appendRangeAsStatement(
         codeBlocks: CodeBlocks,
         start: number,
         end: number,
     ) {
-        processAppend(codeBlocks, start, end)
-        codeBlocks.appendSplitPunctuators(";")
+        if (append(codeBlocks, start, end)) {
+            codeBlocks.appendSplitPunctuators(";")
+        }
+    }
+
+    function transformExportNamed(body: ESLintExportNamedDeclaration) {
+        const [start, end] = getNodeFullRange(body)
+        // Consume code up to the start position.
+        appendRangeAsStatement(statementCodeBlocks, usedOffset, start)
+
+        const tokens = ast.tokens!
+        const exportTokenIndex = tokens.findIndex(
+            (t) => t.range[0] === body.range[0],
+        )
+        const exportToken = tokens[exportTokenIndex]
+        if (exportToken && exportToken.value === "export") {
+            // Consume code up to the start position of `export`.
+            // The code may contain legacy decorators.
+            append(statementCodeBlocks, usedOffset, exportToken.range[0])
+            if (body.declaration) {
+                // Append declaration section (Skip `export` token)
+                appendRangeAsStatement(
+                    statementCodeBlocks,
+                    exportToken.range[1],
+                    end,
+                )
+
+                restoreASTCallbacks.addCallback(
+                    scriptSetupStartOffset,
+                    [start, end],
+                    (statement) => {
+                        if (statement.type !== body.declaration!.type) {
+                            return null
+                        }
+                        fixNodeLocations(
+                            body,
+                            result.visitorKeys,
+                            offsetLocationCalculator,
+                        )
+                        fixLocation(exportToken, offsetLocationCalculator)
+                        body.declaration = statement
+                        statement.parent = body
+                        return {
+                            statement: body,
+                            tokens: [exportToken],
+                        }
+                    },
+                )
+            } else {
+                // Append the code that converted specifiers to destructuring.
+                statementCodeBlocks.appendSplitPunctuators("(")
+                const restoreTokens: Token[] = [exportToken]
+                let startOffset = exportToken.range[1]
+                for (const spec of body.specifiers) {
+                    if (spec.local.range[0] < spec.exported.range[0]) {
+                        // {a as b}
+                        const localTokenIndex = tokens.findIndex(
+                            (t) => t.range[0] === spec.local.range[0],
+                            exportTokenIndex,
+                        )
+                        checkToken(
+                            tokens[localTokenIndex],
+                            (spec.local as ESLintIdentifier).name,
+                        )
+                        const asToken = tokens[localTokenIndex + 1]
+                        checkToken(asToken, "as")
+                        restoreTokens.push(asToken)
+                        const exportedToken = tokens[localTokenIndex + 2]
+                        checkToken(
+                            exportedToken,
+                            spec.exported.type === "Identifier"
+                                ? spec.exported.name
+                                : spec.exported.raw,
+                        )
+                        restoreTokens.push(exportedToken)
+                        // Skip `as` token
+                        append(
+                            statementCodeBlocks,
+                            startOffset,
+                            asToken.range[0],
+                        )
+                        append(
+                            statementCodeBlocks,
+                            asToken.range[1],
+                            exportedToken.range[0],
+                        )
+                        startOffset = exportedToken.range[1]
+                    }
+                }
+                append(statementCodeBlocks, startOffset, end)
+                statementCodeBlocks.appendSplitPunctuators(")")
+                statementCodeBlocks.appendSplitPunctuators(";")
+
+                restoreASTCallbacks.addCallback(
+                    scriptSetupStartOffset,
+                    [start, end],
+                    (statement) => {
+                        if (
+                            statement.type !== "ExpressionStatement" ||
+                            statement.expression.type !== "ObjectExpression"
+                        ) {
+                            return null
+                        }
+                        // preprocess and check
+                        const locals: ESLintIdentifier[] = []
+                        for (const prop of statement.expression.properties) {
+                            if (
+                                prop.type !== "Property" ||
+                                prop.value.type !== "Identifier"
+                            ) {
+                                return null
+                            }
+                            locals.push(prop.value)
+                        }
+                        if (body.specifiers.length !== locals.length) {
+                            return null
+                        }
+                        const map = new Map<
+                            ESLintExportSpecifier,
+                            ESLintIdentifier
+                        >()
+                        for (
+                            let index = 0;
+                            index < body.specifiers.length;
+                            index++
+                        ) {
+                            const spec = body.specifiers[index]
+                            const local = locals[index]
+                            map.set(spec, local)
+                        }
+
+                        // restore
+                        fixNodeLocations(
+                            body,
+                            result.visitorKeys,
+                            offsetLocationCalculator,
+                        )
+                        for (const token of restoreTokens) {
+                            fixLocation(token, offsetLocationCalculator)
+                        }
+                        for (const [spec, local] of map) {
+                            spec.local = local
+                            local.parent = spec
+                        }
+                        return {
+                            statement: body,
+                            tokens: restoreTokens,
+                        }
+                    },
+                )
+            }
+        } else {
+            // Unknown format
+            appendRangeAsStatement(statementCodeBlocks, usedOffset, end)
+        }
     }
 
     for (const body of ast.body) {
@@ -558,176 +722,89 @@ function getScriptSetupCodeBlocks(
             (body.type === "ExportNamedDeclaration" && body.source != null)
         ) {
             const [start, end] = getNodeFullRange(body)
-            processStatementCodeBlock(start)
-            processModuleCodeBlock(importCodeBlocks, start, end)
+            // Consume code up to the start position.
+            appendRangeAsStatement(statementCodeBlocks, usedOffset, start)
+            // Append declaration
+            appendRangeAsStatement(importCodeBlocks, start, end)
         } else if (body.type === "ExportDefaultDeclaration") {
             const [start, end] = getNodeFullRange(body)
-            processStatementCodeBlock(start)
-            processModuleCodeBlock(exportDefaultCodeBlocks, start, end)
+            // Consume code up to the start position.
+            appendRangeAsStatement(statementCodeBlocks, usedOffset, start)
+            // Append declaration
+            appendRangeAsStatement(exportDefaultCodeBlocks, start, end)
         } else if (body.type === "ExportNamedDeclaration") {
             // Transform ExportNamedDeclaration
             // The transformed statement ASTs are restored by RestoreASTCallbacks.
             // e.g.
             // - `export let v = 42` -> `let v = 42`
             // - `export {foo, bar as Bar}` -> `({foo, bar})`
-
-            const [start, end] = getNodeFullRange(body)
-            processStatementCodeBlock(start)
-
-            const tokens = ast.tokens!
-            const exportTokenIndex = tokens.findIndex(
-                (t) => t.range[0] === body.range[0],
-            )
-            const exportToken = tokens[exportTokenIndex]
-            if (exportToken && exportToken.value === "export") {
-                processAppend(
-                    statementCodeBlocks,
-                    astOffset,
-                    exportToken.range[0],
-                ) // Maybe decorator
-                if (body.declaration) {
-                    processModuleCodeBlock(
-                        statementCodeBlocks,
-                        exportToken.range[1],
-                        end,
-                    )
-
-                    restoreASTCallbacks.addCallback(
-                        scriptSetupStartOffset,
-                        [start, end],
-                        (statement) => {
-                            if (statement.type !== body.declaration!.type) {
-                                return null
-                            }
-                            fixNodeLocations(
-                                body,
-                                result.visitorKeys,
-                                offsetLocationCalculator,
-                            )
-                            fixLocation(exportToken, offsetLocationCalculator)
-                            body.declaration = statement
-                            statement.parent = body
-                            return {
-                                statement: body,
-                                tokens: [exportToken],
-                            }
-                        },
-                    )
-                } else {
-                    statementCodeBlocks.appendSplitPunctuators("(")
-                    const restoreTokens: Token[] = [exportToken]
-                    let startOffset = exportToken.range[1]
-                    for (const spec of body.specifiers) {
-                        if (spec.local.range[0] < spec.exported.range[0]) {
-                            // {a as b}
-                            const localTokenIndex = tokens.findIndex(
-                                (t) => t.range[0] === spec.local.range[0],
-                                exportTokenIndex,
-                            )
-                            checkToken(
-                                tokens[localTokenIndex],
-                                (spec.local as ESLintIdentifier).name,
-                            )
-                            const asToken = tokens[localTokenIndex + 1]
-                            checkToken(asToken, "as")
-                            restoreTokens.push(asToken)
-                            const exportedToken = tokens[localTokenIndex + 2]
-                            checkToken(
-                                exportedToken,
-                                spec.exported.type === "Identifier"
-                                    ? spec.exported.name
-                                    : spec.exported.raw,
-                            )
-                            restoreTokens.push(exportedToken)
-                            processAppend(
-                                statementCodeBlocks,
-                                startOffset,
-                                asToken.range[0],
-                            )
-                            processAppend(
-                                statementCodeBlocks,
-                                asToken.range[1],
-                                exportedToken.range[0],
-                            )
-                            startOffset = exportedToken.range[1]
-                        }
-                    }
-                    processAppend(statementCodeBlocks, startOffset, end)
-                    statementCodeBlocks.appendSplitPunctuators(")")
-                    statementCodeBlocks.appendSplitPunctuators(";")
-
-                    restoreASTCallbacks.addCallback(
-                        scriptSetupStartOffset,
-                        [start, end],
-                        (statement) => {
-                            if (
-                                statement.type !== "ExpressionStatement" ||
-                                statement.expression.type !== "ObjectExpression"
-                            ) {
-                                return null
-                            }
-                            // preprocess and check
-                            const locals: ESLintIdentifier[] = []
-                            for (const prop of statement.expression
-                                .properties) {
-                                if (
-                                    prop.type !== "Property" ||
-                                    prop.value.type !== "Identifier"
-                                ) {
-                                    return null
-                                }
-                                locals.push(prop.value)
-                            }
-                            if (body.specifiers.length !== locals.length) {
-                                return null
-                            }
-                            const map = new Map<
-                                ESLintExportSpecifier,
-                                ESLintIdentifier
-                            >()
-                            for (
-                                let index = 0;
-                                index < body.specifiers.length;
-                                index++
-                            ) {
-                                const spec = body.specifiers[index]
-                                const local = locals[index]
-                                map.set(spec, local)
-                            }
-
-                            // restore
-                            fixNodeLocations(
-                                body,
-                                result.visitorKeys,
-                                offsetLocationCalculator,
-                            )
-                            for (const token of restoreTokens) {
-                                fixLocation(token, offsetLocationCalculator)
-                            }
-                            for (const [spec, local] of map) {
-                                spec.local = local
-                                local.parent = spec
-                            }
-                            return {
-                                statement: body,
-                                tokens: restoreTokens,
-                            }
-                        },
-                    )
-                }
-            } else {
-                processModuleCodeBlock(statementCodeBlocks, start, end)
-            }
+            transformExportNamed(body)
         }
     }
-    processStatementCodeBlock(scriptSetupEndOffset)
+    // Consume the remaining code.
+    appendRangeAsStatement(
+        statementCodeBlocks,
+        usedOffset,
+        scriptSetupEndOffset,
+    )
 
     // Creates a code block that combines import, statement block, and export default.
     const codeBlocks = new CodeBlocks()
 
+    let postprocess: Postprocess = () => {
+        // noop
+    }
+
     codeBlocks.appendCodeBlocks(importCodeBlocks)
     const scriptSetupBlockRangeStart = codeBlocks.length
     codeBlocks.appendSplitPunctuators("{")
+    const generic = extractGeneric(node)
+    if (generic) {
+        const defineGenericTypeRangeStart = codeBlocks.length
+        for (const defineType of generic.defineTypes) {
+            codeBlocks.append(defineType.define, defineType.node.range[0])
+            codeBlocks.appendSplitPunctuators(";")
+        }
+        const defineGenericTypeRangeEnd = codeBlocks.length
+        postprocess = (eslintResult, context) => {
+            const diffOffset =
+                context.scriptSetupBlockRange[0] - scriptSetupBlockRangeStart
+            const defineGenericTypeRange = [
+                defineGenericTypeRangeStart + diffOffset,
+                defineGenericTypeRangeEnd + diffOffset,
+            ] as const
+
+            function isTypeBlock(
+                block: ESLintNode,
+            ): block is ESLintBlockStatement {
+                return (
+                    block.type === "BlockStatement" &&
+                    context.scriptSetupBlockRange[0] <= block.range[0] &&
+                    block.range[1] <= context.scriptSetupBlockRange[1]
+                )
+            }
+
+            generic.postprocess({
+                result: eslintResult,
+                getTypeBlock: (program) => program.body.find(isTypeBlock)!,
+                isRemoveTarget(nodeOrToken) {
+                    return (
+                        defineGenericTypeRange[0] <= nodeOrToken.range[0] &&
+                        nodeOrToken.range[1] <= defineGenericTypeRange[1]
+                    )
+                },
+                getTypeDefScope(scopeManager) {
+                    const moduleScope =
+                        scopeManager.globalScope.childScopes.find(
+                            (s) => s.type === "module",
+                        ) ?? scopeManager.globalScope
+                    return moduleScope.childScopes.find((scope) =>
+                        isTypeBlock(scope.block as ESLintNode),
+                    )!
+                },
+            })
+        }
+    }
     codeBlocks.appendCodeBlocks(statementCodeBlocks)
     codeBlocks.appendSplitPunctuators("}")
     const scriptSetupBlockRangeEnd = codeBlocks.length
@@ -738,6 +815,7 @@ function getScriptSetupCodeBlocks(
             scriptSetupBlockRangeStart,
             scriptSetupBlockRangeEnd,
         ],
+        postprocess,
         restoreASTCallbacks,
     }
 
diff --git a/src/script-setup/scope-analyzer.ts b/src/script-setup/scope-analyzer.ts
index 1627cced..15d23a3a 100644
--- a/src/script-setup/scope-analyzer.ts
+++ b/src/script-setup/scope-analyzer.ts
@@ -10,6 +10,11 @@ import type {
 } from "../ast"
 import { traverseNodes } from "../ast"
 import { getEslintScope } from "../common/eslint-scope"
+import {
+    findGenericDirective,
+    isScriptElement,
+    isScriptSetupElement,
+} from "../common/ast-utils"
 
 const BUILTIN_COMPONENTS = new Set([
     "template",
@@ -117,7 +122,7 @@ export function analyzeScriptSetupScope(
 ): void {
     analyzeUsedInTemplateVariables(scopeManager, templateBody, df)
 
-    analyzeCompilerMacrosVariables(scopeManager, parserOptions)
+    analyzeScriptSetupVariables(scopeManager, df, parserOptions)
 }
 
 function extractVariables(scopeManager: escopeTypes.ScopeManager) {
@@ -272,12 +277,20 @@ function analyzeUsedInTemplateVariables(
         })
     }
 
-    // Analyze CSS v-bind()
     for (const child of df.children) {
-        if (child.type === "VElement" && child.name === "style") {
-            for (const node of child.children) {
-                if (node.type === "VExpressionContainer") {
-                    processVExpressionContainer(node)
+        if (child.type === "VElement") {
+            if (isScriptSetupElement(child)) {
+                // Analyze <script setup lang="ts" generic="...">
+                const generic = findGenericDirective(child)
+                if (generic) {
+                    processVExpressionContainer(generic.value)
+                }
+            } else if (child.name === "style") {
+                // Analyze CSS v-bind()
+                for (const node of child.children) {
+                    if (node.type === "VExpressionContainer") {
+                        processVExpressionContainer(node)
+                    }
                 }
             }
         }
@@ -285,11 +298,15 @@ function analyzeUsedInTemplateVariables(
 }
 
 /**
- * Analyze compiler macros.
- * If compiler macros were used, add these variables as global variables.
+ * Analyze <script setup> variables.
+ * - Analyze compiler macros.
+ *   If compiler macros were used, add these variables as global variables.
+ * - Generic variables.
+ *   If defined generics are used, add these variables as global variables.
  */
-function analyzeCompilerMacrosVariables(
+function analyzeScriptSetupVariables(
     scopeManager: escopeTypes.ScopeManager,
+    df: VDocumentFragment,
     parserOptions: ParserOptions,
 ) {
     const globalScope = scopeManager.globalScope
@@ -303,22 +320,18 @@ function analyzeCompilerMacrosVariables(
             : [],
     )
 
-    const compilerMacroVariables = new Map<string, escopeTypes.Variable>()
-
-    function addCompilerMacroVariable(reference: escopeTypes.Reference) {
-        const name = reference.identifier.name
-        let variable = compilerMacroVariables.get(name)
-        if (!variable) {
-            variable = new (getEslintScope().Variable)()
-            variable.name = name
-            variable.scope = globalScope
-            globalScope.variables.push(variable)
-            globalScope.set.set(name, variable)
-            compilerMacroVariables.set(name, variable)
+    const genericDefineNames = new Set<string>()
+    const scriptElement = df.children.find(isScriptElement)
+    if (
+        scriptElement &&
+        isScriptSetupElement(scriptElement) &&
+        findGenericDirective(scriptElement)
+    ) {
+        for (const variable of scriptElement.variables) {
+            if (variable.kind === "generic") {
+                genericDefineNames.add(variable.id.name)
+            }
         }
-        // Links the variable and the reference.
-        reference.resolved = variable
-        variable.references.push(reference)
     }
 
     const newThrough: escopeTypes.Reference[] = []
@@ -336,8 +349,40 @@ function analyzeCompilerMacrosVariables(
                 continue
             }
         }
+        if (genericDefineNames.has(reference.identifier.name)) {
+            addGenericVariable(reference)
+            // This reference is removed from `Scope#through`.
+            continue
+        }
+
         newThrough.push(reference)
     }
 
     globalScope.through = newThrough
+
+    function addCompilerMacroVariable(reference: escopeTypes.Reference) {
+        addVariable(globalScope, reference)
+    }
+
+    function addGenericVariable(reference: escopeTypes.Reference) {
+        addVariable(globalScope, reference)
+    }
+}
+
+function addVariable(
+    scope: escopeTypes.Scope,
+    reference: escopeTypes.Reference,
+) {
+    const name = reference.identifier.name
+    let variable = scope.set.get(name)
+    if (!variable) {
+        variable = new (getEslintScope().Variable)()
+        variable.name = name
+        variable.scope = scope
+        scope.variables.push(variable)
+        scope.set.set(name, variable)
+    }
+    // Links the variable and the reference.
+    reference.resolved = variable
+    variable.references.push(reference)
 }
diff --git a/src/script/generic.ts b/src/script/generic.ts
new file mode 100644
index 00000000..97ec38d7
--- /dev/null
+++ b/src/script/generic.ts
@@ -0,0 +1,241 @@
+import type {
+    ESLintExtendedProgram,
+    ESLintProgram,
+    HasLocation,
+    Token,
+    VElement,
+    VGenericExpression,
+} from "../ast"
+// eslint-disable-next-line node/no-extraneous-import -- ignore
+import type { TSESTree } from "@typescript-eslint/utils"
+import type {
+    Reference,
+    Scope,
+    Variable,
+    ScopeManager,
+    VariableDefinition,
+} from "eslint-scope"
+import { findGenericDirective } from "../common/ast-utils"
+
+export type GenericProcessInfo = {
+    node: VGenericExpression
+    defineTypes: {
+        node: VGenericExpression["params"][number]
+        define: string
+    }[]
+    postprocess: (context: GenericPostprocessContext) => void
+}
+export type GenericPostprocessContext = {
+    result: ESLintExtendedProgram
+    getTypeBlock?: (node: ESLintProgram) => {
+        body: ESLintProgram["body"]
+    }
+    isRemoveTarget: (nodeOrToken: HasLocation) => boolean
+    getTypeDefScope: (scopeManager: ScopeManager) => Scope
+}
+export function extractGeneric(element: VElement): GenericProcessInfo | null {
+    const genericAttr = findGenericDirective(element)
+    if (!genericAttr) {
+        return null
+    }
+    const genericNode = genericAttr.value.expression
+    const defineTypes = genericNode.params.map((t, i) => ({
+        node: t,
+        define: `type ${t.name.name} = ${getConstraint(
+            t,
+            genericNode.rawParams[i],
+        )}`,
+    }))
+
+    return {
+        node: genericNode,
+        defineTypes,
+        postprocess({ result, getTypeBlock, isRemoveTarget, getTypeDefScope }) {
+            const node = getTypeBlock?.(result.ast) ?? result.ast
+            removeTypeDeclarations(node, isRemoveTarget)
+            if (result.ast.tokens) {
+                removeTypeDeclarationTokens(result.ast.tokens, isRemoveTarget)
+            }
+            if (result.ast.comments) {
+                removeTypeDeclarationTokens(result.ast.comments, isRemoveTarget)
+            }
+            if (result.scopeManager) {
+                const typeDefScope = getTypeDefScope(result.scopeManager)
+                restoreScope(result.scopeManager, typeDefScope, isRemoveTarget)
+            }
+        },
+    }
+
+    function removeTypeDeclarations(
+        node: {
+            body: ESLintProgram["body"]
+        },
+        isRemoveTarget: (nodeOrToken: HasLocation) => boolean,
+    ) {
+        for (let index = node.body.length - 1; index >= 0; index--) {
+            if (isRemoveTarget(node.body[index])) {
+                node.body.splice(index, 1)
+            }
+        }
+    }
+
+    function removeTypeDeclarationTokens(
+        tokens: Token[],
+        isRemoveTarget: (nodeOrToken: HasLocation) => boolean,
+    ) {
+        for (let index = tokens.length - 1; index >= 0; index--) {
+            if (isRemoveTarget(tokens[index])) {
+                tokens.splice(index, 1)
+            }
+        }
+    }
+
+    function restoreScope(
+        scopeManager: ScopeManager,
+        typeDefScope: Scope,
+        isRemoveTarget: (nodeOrToken: HasLocation) => boolean,
+    ) {
+        for (const variable of [...typeDefScope.variables]) {
+            let def = variable.defs.find((d) =>
+                isRemoveTarget(d.name as HasLocation),
+            )
+            while (def) {
+                removeVariableDef(variable, def, typeDefScope)
+                def = variable.defs.find((d) =>
+                    isRemoveTarget(d.name as HasLocation),
+                )
+            }
+        }
+        for (const reference of [...typeDefScope.references]) {
+            if (isRemoveTarget(reference.identifier as HasLocation)) {
+                removeReference(reference, typeDefScope)
+            }
+        }
+
+        for (const scope of [...scopeManager.scopes]) {
+            if (isRemoveTarget(scope.block as HasLocation)) {
+                removeScope(scopeManager, scope)
+            }
+        }
+    }
+}
+
+function getConstraint(node: TSESTree.TSTypeParameter, rawParam: string) {
+    if (!node.constraint) {
+        return "unknown"
+    }
+    const start = node.range[0]
+    return rawParam.slice(
+        node.constraint.range[0] - start,
+        node.constraint.range[1] - start,
+    )
+}
+
+/** Remove variable def */
+function removeVariableDef(
+    variable: Variable,
+    def: VariableDefinition,
+    scope: Scope,
+): void {
+    const defIndex = variable.defs.indexOf(def)
+    if (defIndex < 0) {
+        return
+    }
+    variable.defs.splice(defIndex, 1)
+    if (variable.defs.length === 0) {
+        // Remove variable
+        referencesToThrough(variable.references, scope)
+        variable.references.forEach((r) => {
+            if ((r as any).init) {
+                ;(r as any).init = false
+            }
+            r.resolved = null
+        })
+        scope.variables.splice(scope.variables.indexOf(variable), 1)
+        const name = variable.name
+        if (variable === scope.set.get(name)) {
+            scope.set.delete(name)
+        }
+    } else {
+        const idIndex = variable.identifiers.indexOf(def.name)
+        if (idIndex >= 0) {
+            variable.identifiers.splice(idIndex, 1)
+        }
+    }
+}
+
+/** Move reference to through */
+function referencesToThrough(references: Reference[], baseScope: Scope) {
+    let scope: Scope | null = baseScope
+    while (scope) {
+        addAllReferences(scope.through, references)
+        scope = scope.upper
+    }
+}
+
+/**
+ * Add all references to array
+ */
+function addAllReferences(list: Reference[], elements: Reference[]): void {
+    list.push(...elements)
+    list.sort((a, b) => a.identifier.range![0] - b.identifier.range![0])
+}
+
+/** Remove reference */
+function removeReference(reference: Reference, baseScope: Scope): void {
+    if (reference.resolved) {
+        if (
+            reference.resolved.defs.some((d) => d.name === reference.identifier)
+        ) {
+            // remove var
+            const varIndex = baseScope.variables.indexOf(reference.resolved)
+            if (varIndex >= 0) {
+                baseScope.variables.splice(varIndex, 1)
+            }
+            const name = reference.identifier.name
+            if (reference.resolved === baseScope.set.get(name)) {
+                baseScope.set.delete(name)
+            }
+        } else {
+            const refIndex = reference.resolved.references.indexOf(reference)
+            if (refIndex >= 0) {
+                reference.resolved.references.splice(refIndex, 1)
+            }
+        }
+    }
+
+    let scope: Scope | null = baseScope
+    while (scope) {
+        const refIndex = scope.references.indexOf(reference)
+        if (refIndex >= 0) {
+            scope.references.splice(refIndex, 1)
+        }
+        const throughIndex = scope.through.indexOf(reference)
+        if (throughIndex >= 0) {
+            scope.through.splice(throughIndex, 1)
+        }
+        scope = scope.upper
+    }
+}
+
+/** Remove scope */
+function removeScope(scopeManager: ScopeManager, scope: Scope): void {
+    for (const childScope of scope.childScopes) {
+        removeScope(scopeManager, childScope)
+    }
+
+    while (scope.references[0]) {
+        removeReference(scope.references[0], scope)
+    }
+    const upper = scope.upper
+    if (upper) {
+        const index = upper.childScopes.indexOf(scope)
+        if (index >= 0) {
+            upper.childScopes.splice(index, 1)
+        }
+    }
+    const index = scopeManager.scopes.indexOf(scope)
+    if (index >= 0) {
+        scopeManager.scopes.splice(index, 1)
+    }
+}
diff --git a/src/script/index.ts b/src/script/index.ts
index 62cd8708..6bb846b1 100644
--- a/src/script/index.ts
+++ b/src/script/index.ts
@@ -31,6 +31,8 @@ import type {
     VOnExpression,
     VSlotScopeExpression,
     OffsetRange,
+    VGenericExpression,
+    ESLintClassExpression,
 } from "../ast"
 import { ParseError } from "../ast"
 import { debug } from "../common/debug"
@@ -61,6 +63,10 @@ import { isScriptSetupElement } from "../common/ast-utils"
 import type { LinesAndColumns } from "../common/lines-and-columns"
 import type { ParserObject } from "../common/parser-object"
 import { isEnhancedParserObject, isParserObject } from "../common/parser-object"
+// eslint-disable-next-line node/no-extraneous-import -- ignore
+import type { TSESTree } from "@typescript-eslint/utils"
+import type { GenericProcessInfo } from "./generic"
+import { extractGeneric } from "./generic"
 
 // [1] = aliases.
 // [2] = delimiter.
@@ -587,6 +593,7 @@ export function parseScriptElement(
                   originalParserOptions.ecmaVersion || DEFAULT_ECMA_VERSION,
           }
 
+    let generic: GenericProcessInfo | null = null
     let code: string
     let offset: number
     const textNode = node.children[0]
@@ -594,6 +601,14 @@ export function parseScriptElement(
         const [scriptStartOffset, scriptEndOffset] = textNode.range
         code = sfcCode.slice(scriptStartOffset, scriptEndOffset)
         offset = scriptStartOffset
+        generic = extractGeneric(node)
+        if (generic) {
+            const defineTypesCode = `${generic.defineTypes
+                .map((e) => e.define)
+                .join(";")};\n`
+            code = defineTypesCode + code
+            offset -= defineTypesCode.length
+        }
     } else {
         code = ""
         offset = node.startTag.range[1]
@@ -601,7 +616,38 @@ export function parseScriptElement(
     const locationCalculator =
         linesAndColumns.createOffsetLocationCalculator(offset)
     const result = parseScriptFragment(code, locationCalculator, parserOptions)
-
+    if (generic) {
+        generic.postprocess({
+            result,
+            isRemoveTarget(nodeOrToken) {
+                return nodeOrToken.range[1] <= textNode.range[0]
+            },
+            getTypeDefScope(scopeManager) {
+                return (
+                    scopeManager.globalScope.childScopes.find(
+                        (s) => s.type === "module",
+                    ) ?? scopeManager.globalScope
+                )
+            },
+        })
+        const startToken = [
+            result.ast.body[0],
+            result.ast.tokens?.[0],
+            result.ast.comments?.[0],
+        ]
+            .filter((e): e is NonNullable<typeof e> => Boolean(e))
+            .sort((a, b) => a.range[0] - b.range[0])
+            .find((t) => Boolean(t))
+
+        // Restore Program node location
+        if (startToken && result.ast.range[0] !== startToken.range[0]) {
+            result.ast.range[0] = startToken.range[0]
+            if (result.ast.start != null) {
+                result.ast.start = startToken.start
+            }
+            result.ast.loc.start = { ...startToken.loc.start }
+        }
+    }
     // Needs the tokens of start/end tags for `lines-around-*` rules to work
     // correctly.
     if (result.ast.tokens != null) {
@@ -769,6 +815,7 @@ export function parseVForExpression(
         const comments = ast.comments || []
         const scope = analyzeVariablesAndExternalReferences(
             result,
+            "v-for",
             parserOptions,
         )
         const references = scope.references
@@ -1160,6 +1207,7 @@ export function parseSlotScopeExpression(
         const comments = ast.comments || []
         const scope = analyzeVariablesAndExternalReferences(
             result,
+            "scope",
             parserOptions,
         )
         const references = scope.references
@@ -1192,3 +1240,91 @@ export function parseSlotScopeExpression(
         return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)
     }
 }
+
+/**
+ * Parse the source code of `generic` directive.
+ * @param code The source code of `generic` directive.
+ * @param locationCalculator The location calculator for the inline script.
+ * @param parserOptions The parser options.
+ * @returns The result of parsing.
+ */
+export function parseGenericExpression(
+    code: string,
+    locationCalculator: LocationCalculatorForHtml,
+    parserOptions: ParserOptions,
+): ExpressionParseResult<VGenericExpression> {
+    debug('[script] parse generic definition: "void function<%s>() {}"', code)
+
+    if (code.trim() === "") {
+        throwEmptyError(locationCalculator, "a type parameter")
+    }
+
+    try {
+        const result = parseScriptFragment(
+            `void function<${code}>(){}`,
+            locationCalculator.getSubCalculatorShift(-14),
+            { ...parserOptions, project: undefined },
+        )
+        const { ast } = result
+        const statement = ast.body[0] as ESLintExpressionStatement
+        const rawExpression = statement.expression as ESLintUnaryExpression
+        const classDecl = rawExpression.argument as ESLintClassExpression
+        const typeParameters = (classDecl as TSESTree.ClassExpression)
+            .typeParameters
+        const params = typeParameters?.params
+
+        if (!params || params.length === 0) {
+            return {
+                expression: null,
+                tokens: [],
+                comments: [],
+                references: [],
+                variables: [],
+            }
+        }
+
+        const tokens = ast.tokens || []
+        const comments = ast.comments || []
+        const scope = analyzeVariablesAndExternalReferences(
+            result,
+            "generic",
+            parserOptions,
+        )
+        const references = scope.references
+        const variables = scope.variables
+        const firstParam = first(params)!
+        const lastParam = last(params)!
+        const expression: VGenericExpression = {
+            type: "VGenericExpression",
+            range: [firstParam.range[0], lastParam.range[1]],
+            loc: { start: firstParam.loc.start, end: lastParam.loc.end },
+            parent: DUMMY_PARENT,
+            params,
+            rawParams: params.map((param) =>
+                code.slice(
+                    param.range[0] - typeParameters.range[0] - 1,
+                    param.range[1] - typeParameters.range[0] - 1,
+                ),
+            ),
+        }
+
+        // Modify parent.
+        for (const param of params) {
+            ;(param as any).parent = expression
+        }
+
+        // Remove `void` `function` `<` `>` `(` `)` `{` `}`.
+        tokens.shift()
+        tokens.shift()
+        tokens.shift()
+        tokens.pop()
+        tokens.pop()
+        tokens.pop()
+        tokens.pop()
+        tokens.pop()
+
+        return { expression, tokens, comments, references, variables }
+    } catch (err) {
+        return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)
+    }
+}
diff --git a/src/script/scope-analyzer.ts b/src/script/scope-analyzer.ts
index 38de19f1..261e664a 100644
--- a/src/script/scope-analyzer.ts
+++ b/src/script/scope-analyzer.ts
@@ -72,10 +72,13 @@ function transformReference(reference: escopeTypes.Reference): Reference {
  * @param variable The source variable object.
  * @returns The transformed variable object.
  */
-function transformVariable(variable: escopeTypes.Variable): Variable {
+function transformVariable(
+    variable: escopeTypes.Variable,
+    kind: Variable["kind"],
+): Variable {
     const ret: Variable = {
         id: variable.defs[0].name as ESLintIdentifier,
-        kind: variable.scope.type === "for" ? "v-for" : "scope",
+        kind,
         references: [],
     }
     Object.defineProperty(ret, "references", { enumerable: false })
@@ -147,13 +150,14 @@ export function analyzeExternalReferences(
  */
 export function analyzeVariablesAndExternalReferences(
     parserResult: ParserResult,
+    kind: Variable["kind"],
     parserOptions: ParserOptions,
 ): { variables: Variable[]; references: Reference[] } {
     const scope = analyze(parserResult, parserOptions)
     return {
         variables: getForScope(scope)
             .variables.filter(hasDefinition)
-            .map(transformVariable),
+            .map((v) => transformVariable(v, kind)),
         references: scope.through.filter(isUnique).map(transformReference),
     }
 }
diff --git a/src/template/index.ts b/src/template/index.ts
index 9c2b5a9a..b58703e6 100644
--- a/src/template/index.ts
+++ b/src/template/index.ts
@@ -17,6 +17,7 @@ import type {
     VExpressionContainer,
     VFilterSequenceExpression,
     VForExpression,
+    VGenericExpression,
     VIdentifier,
     VLiteral,
     VNode,
@@ -32,13 +33,18 @@ import {
     parseVForExpression,
     parseVOnExpression,
     parseSlotScopeExpression,
+    parseGenericExpression,
 } from "../script"
 import {
     createSimpleToken,
     insertComments,
     replaceTokens,
 } from "../common/token-utils"
-import { getOwnerDocument } from "../common/ast-utils"
+import {
+    getOwnerDocument,
+    isScriptSetupElement,
+    isTSLang,
+} from "../common/ast-utils"
 import { insertError } from "../common/error-utils"
 
 const shorthandSign = /^[.:@#]/u
@@ -402,9 +408,10 @@ function createDirectiveKey(
 function parseAttributeValue(
     code: string,
     parserOptions: ParserOptions,
+    scriptParserOptions: ParserOptions,
     globalLocationCalculator: LocationCalculatorForHtml,
     node: VLiteral,
-    tagName: string,
+    element: VElement,
     directiveKey: VDirectiveKey,
 ): ExpressionParseResult<
     | ESLintExpression
@@ -412,13 +419,18 @@ function parseAttributeValue(
     | VForExpression
     | VOnExpression
     | VSlotScopeExpression
+    | VGenericExpression
 > {
     const firstChar = code[node.range[0]]
     const quoted = firstChar === '"' || firstChar === "'"
     const locationCalculator = globalLocationCalculator.getSubCalculatorAfter(
         node.range[0] + (quoted ? 1 : 0),
     )
-    const directiveName = directiveKey.name.name
+    const directiveKind = getStandardDirectiveKind(
+        parserOptions,
+        element,
+        directiveKey,
+    )
 
     let result: ExpressionParseResult<
         | ESLintExpression
@@ -426,6 +438,7 @@ function parseAttributeValue(
         | VForExpression
         | VOnExpression
         | VSlotScopeExpression
+        | VGenericExpression
     >
     if (quoted && node.value === "") {
         result = {
@@ -435,35 +448,37 @@ function parseAttributeValue(
             variables: [],
             references: [],
         }
-    } else if (directiveName === "for") {
+    } else if (directiveKind === "for") {
         result = parseVForExpression(
             node.value,
             locationCalculator,
             parserOptions,
         )
-    } else if (directiveName === "on" && directiveKey.argument != null) {
+    } else if (directiveKind === "on" && directiveKey.argument != null) {
         result = parseVOnExpression(
             node.value,
             locationCalculator,
             parserOptions,
         )
-    } else if (
-        directiveName === "slot" ||
-        directiveName === "slot-scope" ||
-        (tagName === "template" && directiveName === "scope")
-    ) {
+    } else if (directiveKind === "slot") {
         result = parseSlotScopeExpression(
             node.value,
             locationCalculator,
             parserOptions,
         )
-    } else if (directiveName === "bind") {
+    } else if (directiveKind === "bind") {
         result = parseExpression(
             node.value,
             locationCalculator,
             parserOptions,
             { allowFilters: true },
         )
+    } else if (directiveKind === "generic") {
+        result = parseGenericExpression(
+            node.value,
+            locationCalculator,
+            scriptParserOptions,
+        )
     } else {
         result = parseExpression(node.value, locationCalculator, parserOptions)
     }
@@ -493,6 +508,38 @@ function parseAttributeValue(
     return result
 }
 
+function getStandardDirectiveKind(
+    parserOptions: ParserOptions,
+    element: VElement,
+    directiveKey: VDirectiveKey,
+) {
+    const directiveName = directiveKey.name.name
+
+    if (directiveName === "for") {
+        return "for"
+    } else if (directiveName === "on") {
+        return "on"
+    } else if (
+        directiveName === "slot" ||
+        directiveName === "slot-scope" ||
+        (directiveName === "scope" &&
+            getTagName(element, isSFCFile(parserOptions)) === "template")
+    ) {
+        return "slot"
+    } else if (directiveName === "bind") {
+        return "bind"
+    } else if (
+        directiveName === "generic" &&
+        element.parent.type === "VDocumentFragment" &&
+        getTagName(element, isSFCFile(parserOptions)) === "script" &&
+        isScriptSetupElement(element) &&
+        isTSLang(element)
+    ) {
+        return "generic"
+    }
+    return null
+}
+
 /**
  * Resolve the variable of the given reference.
  * @param referene The reference to resolve.
@@ -534,6 +581,7 @@ export interface Mustache {
 export function convertToDirective(
     code: string,
     parserOptions: ParserOptions,
+    scriptParserOptions: ParserOptions,
     locationCalculator: LocationCalculatorForHtml,
     node: VAttribute,
 ): void {
@@ -585,9 +633,10 @@ export function convertToDirective(
         const ret = parseAttributeValue(
             code,
             parserOptions,
+            scriptParserOptions,
             locationCalculator,
             node.value,
-            getTagName(node.parent.parent, isSFCFile(parserOptions)),
+            node.parent.parent,
             directive.key,
         )
 
diff --git a/test/ast.js b/test/ast.js
index 98ca9b89..c5e946af 100644
--- a/test/ast.js
+++ b/test/ast.js
@@ -173,13 +173,14 @@ function validateParent(source, parserOptions) {
 describe("Template AST", () => {
     for (const name of TARGETS) {
         const sourcePath = path.join(ROOT, `${name}/source.vue`)
-        const optionsPath = path.join(ROOT, `${name}/parser-options.json`)
+        const optionsPath = [
+            path.join(ROOT, `${name}/parser-options.json`),
+            path.join(ROOT, `${name}/parser-options.js`),
+        ].find((fp) => fs.existsSync(fp))
         const requirementsPath = path.join(ROOT, `${name}/requirements.json`)
         const servicesPath = path.join(ROOT, `${name}/services.json`)
         const source = fs.readFileSync(sourcePath, "utf8")
-        const parserOptions = fs.existsSync(optionsPath)
-            ? JSON.parse(fs.readFileSync(optionsPath, "utf8"))
-            : {}
+        const parserOptions = optionsPath ? require(optionsPath) : {}
         const requirements = fs.existsSync(requirementsPath)
             ? JSON.parse(fs.readFileSync(requirementsPath, "utf8"))
             : {}
diff --git a/test/document-fragment.js b/test/document-fragment.js
index df322701..b8f95f09 100644
--- a/test/document-fragment.js
+++ b/test/document-fragment.js
@@ -55,11 +55,12 @@ describe("services.getDocumentFragment", () => {
             .readdirSync(path.join(ROOT, name))
             .find((f) => f.startsWith("source."))
         const sourcePath = path.join(ROOT, `${name}/${sourceFileName}`)
-        const optionsPath = path.join(ROOT, `${name}/parser-options.json`)
+        const optionsPath = [
+            path.join(ROOT, `${name}/parser-options.json`),
+            path.join(ROOT, `${name}/parser-options.js`),
+        ].find((fp) => fs.existsSync(fp))
         const source = fs.readFileSync(sourcePath, "utf8")
-        const parserOptions = fs.existsSync(optionsPath)
-            ? JSON.parse(fs.readFileSync(optionsPath, "utf8"))
-            : {}
+        const parserOptions = optionsPath ? require(optionsPath) : {}
         const options = Object.assign(
             { filePath: sourcePath },
             PARSER_OPTIONS,
diff --git a/test/fixtures/ast/custom-template-tokenizer/parser-options.js b/test/fixtures/ast/custom-template-tokenizer/parser-options.js
new file mode 100644
index 00000000..12123f0a
--- /dev/null
+++ b/test/fixtures/ast/custom-template-tokenizer/parser-options.js
@@ -0,0 +1,6 @@
+"use strict"
+module.exports = {
+  "templateTokenizer": {
+    "customLang": require.resolve("./custom-tokenizer.js")
+  }
+}
diff --git a/test/fixtures/ast/custom-template-tokenizer/parser-options.json b/test/fixtures/ast/custom-template-tokenizer/parser-options.json
deleted file mode 100644
index bfb18874..00000000
--- a/test/fixtures/ast/custom-template-tokenizer/parser-options.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "templateTokenizer": {
-    "customLang": "./test/fixtures/ast/custom-template-tokenizer/custom-tokenizer.js"
-  }
-}
diff --git a/test/fixtures/ast/multiple-scripts-9/ast.json b/test/fixtures/ast/multiple-scripts-9/ast.json
index ae3782a8..00d1ffaf 100644
--- a/test/fixtures/ast/multiple-scripts-9/ast.json
+++ b/test/fixtures/ast/multiple-scripts-9/ast.json
@@ -1,11 +1,11 @@
 {
     "type": "Program",
-    "start": 8,
+    "start": 2,
     "end": 48,
     "loc": {
         "start": {
-            "line": 3,
-            "column": 12
+            "line": 1,
+            "column": 2
         },
         "end": {
             "line": 4,
@@ -13,7 +13,7 @@
         }
     },
     "range": [
-        31,
+        2,
         47
     ],
     "body": [
diff --git a/test/fixtures/ast/vue3.3-generic-1/ast.json b/test/fixtures/ast/vue3.3-generic-1/ast.json
new file mode 100644
index 00000000..c00e934a
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-1/ast.json
@@ -0,0 +1,1046 @@
+{
+    "type": "Program",
+    "body": [
+        {
+            "type": "ExpressionStatement",
+            "expression": {
+                "type": "CallExpression",
+                "callee": {
+                    "type": "Identifier",
+                    "name": "defineProps",
+                    "range": [
+                        37,
+                        48
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 11
+                        }
+                    }
+                },
+                "arguments": [],
+                "optional": false,
+                "range": [
+                    37,
+                    59
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 22
+                    }
+                },
+                "typeParameters": {
+                    "type": "TSTypeParameterInstantiation",
+                    "range": [
+                        48,
+                        57
+                    ],
+                    "params": [
+                        {
+                            "type": "TSTypeLiteral",
+                            "members": [
+                                {
+                                    "type": "TSPropertySignature",
+                                    "computed": false,
+                                    "key": {
+                                        "type": "Identifier",
+                                        "name": "foo",
+                                        "range": [
+                                            50,
+                                            53
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 2,
+                                                "column": 13
+                                            },
+                                            "end": {
+                                                "line": 2,
+                                                "column": 16
+                                            }
+                                        }
+                                    },
+                                    "typeAnnotation": {
+                                        "type": "TSTypeAnnotation",
+                                        "loc": {
+                                            "start": {
+                                                "line": 2,
+                                                "column": 16
+                                            },
+                                            "end": {
+                                                "line": 2,
+                                                "column": 18
+                                            }
+                                        },
+                                        "range": [
+                                            53,
+                                            55
+                                        ],
+                                        "typeAnnotation": {
+                                            "type": "TSTypeReference",
+                                            "typeName": {
+                                                "type": "Identifier",
+                                                "name": "T",
+                                                "range": [
+                                                    54,
+                                                    55
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 2,
+                                                        "column": 17
+                                                    },
+                                                    "end": {
+                                                        "line": 2,
+                                                        "column": 18
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                54,
+                                                55
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 2,
+                                                    "column": 17
+                                                },
+                                                "end": {
+                                                    "line": 2,
+                                                    "column": 18
+                                                }
+                                            }
+                                        }
+                                    },
+                                    "range": [
+                                        50,
+                                        55
+                                    ],
+                                    "loc": {
+                                        "start": {
+                                            "line": 2,
+                                            "column": 13
+                                        },
+                                        "end": {
+                                            "line": 2,
+                                            "column": 18
+                                        }
+                                    }
+                                }
+                            ],
+                            "range": [
+                                49,
+                                56
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 2,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "line": 2,
+                                    "column": 19
+                                }
+                            }
+                        }
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 11
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 20
+                        }
+                    }
+                }
+            },
+            "range": [
+                37,
+                59
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 22
+                }
+            }
+        }
+    ],
+    "sourceType": "module",
+    "range": [
+        37,
+        60
+    ],
+    "loc": {
+        "start": {
+            "line": 2,
+            "column": 0
+        },
+        "end": {
+            "line": 3,
+            "column": 0
+        }
+    },
+    "tokens": [
+        {
+            "type": "Punctuator",
+            "range": [
+                0,
+                36
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 1,
+                    "column": 36
+                }
+            },
+            "value": "<script>"
+        },
+        {
+            "type": "Identifier",
+            "value": "defineProps",
+            "range": [
+                37,
+                48
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 11
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "<",
+            "range": [
+                48,
+                49
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 11
+                },
+                "end": {
+                    "line": 2,
+                    "column": 12
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "{",
+            "range": [
+                49,
+                50
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 12
+                },
+                "end": {
+                    "line": 2,
+                    "column": 13
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                50,
+                53
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 13
+                },
+                "end": {
+                    "line": 2,
+                    "column": 16
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ":",
+            "range": [
+                53,
+                54
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 16
+                },
+                "end": {
+                    "line": 2,
+                    "column": 17
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                54,
+                55
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 17
+                },
+                "end": {
+                    "line": 2,
+                    "column": 18
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "}",
+            "range": [
+                55,
+                56
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 18
+                },
+                "end": {
+                    "line": 2,
+                    "column": 19
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ">",
+            "range": [
+                56,
+                57
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 19
+                },
+                "end": {
+                    "line": 2,
+                    "column": 20
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "(",
+            "range": [
+                57,
+                58
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 20
+                },
+                "end": {
+                    "line": 2,
+                    "column": 21
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ")",
+            "range": [
+                58,
+                59
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 21
+                },
+                "end": {
+                    "line": 2,
+                    "column": 22
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                60,
+                69
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "value": "</script>"
+        }
+    ],
+    "comments": [],
+    "templateBody": {
+        "type": "VElement",
+        "range": [
+            70,
+            100
+        ],
+        "loc": {
+            "start": {
+                "line": 4,
+                "column": 0
+            },
+            "end": {
+                "line": 6,
+                "column": 11
+            }
+        },
+        "name": "template",
+        "rawName": "template",
+        "namespace": "http://www.w3.org/1999/xhtml",
+        "startTag": {
+            "type": "VStartTag",
+            "range": [
+                70,
+                80
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 4,
+                    "column": 10
+                }
+            },
+            "selfClosing": false,
+            "attributes": []
+        },
+        "children": [
+            {
+                "type": "VText",
+                "range": [
+                    80,
+                    81
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "VExpressionContainer",
+                "range": [
+                    81,
+                    88
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 7
+                    }
+                },
+                "expression": {
+                    "type": "Identifier",
+                    "name": "foo",
+                    "range": [
+                        83,
+                        86
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 5
+                        }
+                    }
+                },
+                "references": [
+                    {
+                        "id": {
+                            "type": "Identifier",
+                            "name": "foo",
+                            "range": [
+                                83,
+                                86
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 5,
+                                    "column": 2
+                                },
+                                "end": {
+                                    "line": 5,
+                                    "column": 5
+                                }
+                            }
+                        },
+                        "mode": "r",
+                        "isValueReference": true,
+                        "isTypeReference": false
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "range": [
+                    88,
+                    89
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            }
+        ],
+        "endTag": {
+            "type": "VEndTag",
+            "range": [
+                89,
+                100
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 11
+                }
+            }
+        },
+        "variables": [],
+        "tokens": [
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    0,
+                    7
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 7
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    8,
+                    13
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 13
+                    }
+                },
+                "value": "setup"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    14,
+                    18
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 14
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 18
+                    }
+                },
+                "value": "lang"
+            },
+            {
+                "type": "HTMLAssociation",
+                "range": [
+                    18,
+                    19
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 18
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 19
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLLiteral",
+                "range": [
+                    19,
+                    23
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 19
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 23
+                    }
+                },
+                "value": "ts"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    24,
+                    31
+                ],
+                "loc": {
+                    "start": {
+                        "column": 24,
+                        "line": 1
+                    },
+                    "end": {
+                        "column": 31,
+                        "line": 1
+                    }
+                },
+                "value": "generic"
+            },
+            {
+                "type": "HTMLAssociation",
+                "range": [
+                    31,
+                    32
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 31
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 32
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "Punctuator",
+                "range": [
+                    32,
+                    33
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 32
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 33
+                    }
+                },
+                "value": "\""
+            },
+            {
+                "type": "Identifier",
+                "value": "T",
+                "range": [
+                    33,
+                    34
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 33
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 34
+                    }
+                }
+            },
+            {
+                "type": "Punctuator",
+                "range": [
+                    34,
+                    35
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 34
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 35
+                    }
+                },
+                "value": "\""
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    35,
+                    36
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 35
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 36
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    36,
+                    37
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 36
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    37,
+                    59
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 22
+                    }
+                },
+                "value": "defineProps<{foo:T}>()"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    59,
+                    60
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 22
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    60,
+                    68
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 8
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    68,
+                    69
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 9
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    69,
+                    70
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    70,
+                    79
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 9
+                    }
+                },
+                "value": "template"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    79,
+                    80
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 10
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    80,
+                    81
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "VExpressionStart",
+                "range": [
+                    81,
+                    83
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 2
+                    }
+                },
+                "value": "{{"
+            },
+            {
+                "type": "Identifier",
+                "value": "foo",
+                "range": [
+                    83,
+                    86
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 2
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 5
+                    }
+                }
+            },
+            {
+                "type": "VExpressionEnd",
+                "range": [
+                    86,
+                    88
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 7
+                    }
+                },
+                "value": "}}"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    88,
+                    89
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    89,
+                    99
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 10
+                    }
+                },
+                "value": "template"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    99,
+                    100
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 11
+                    }
+                },
+                "value": ""
+            }
+        ],
+        "comments": [],
+        "errors": []
+    }
+}
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-1/parser-options.json b/test/fixtures/ast/vue3.3-generic-1/parser-options.json
new file mode 100644
index 00000000..0ead30e9
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-1/parser-options.json
@@ -0,0 +1,6 @@
+{
+  "sourceType": "module",
+  "parser": {
+    "ts": "@typescript-eslint/parser"
+  }
+}
diff --git a/test/fixtures/ast/vue3.3-generic-1/scope.json b/test/fixtures/ast/vue3.3-generic-1/scope.json
new file mode 100644
index 00000000..f67735c2
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-1/scope.json
@@ -0,0 +1,1022 @@
+{
+    "type": "global",
+    "variables": [
+        {
+            "name": "ClassMemberDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassMethodDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassGetterDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassSetterDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorTarget",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassFieldDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "MethodDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ParameterDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Symbol",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyKey",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDescriptor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDescriptorMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Object",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ObjectConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Function",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "FunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ThisParameterType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "OmitThisParameter",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "CallableFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NewableFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IArguments",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "String",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "StringConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Boolean",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "BooleanConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Number",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NumberConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TemplateStringsArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportMeta",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportCallOptions",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportAssertions",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Math",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Date",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DateConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpMatchArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpExecArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExp",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Error",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "EvalError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "EvalErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RangeError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RangeErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReferenceError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReferenceErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SyntaxError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SyntaxErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypeError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypeErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "URIError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "URIErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "JSON",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlyArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ConcatArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypedPropertyDescriptor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseConstructorLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Promise",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Awaited",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Partial",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Required",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Readonly",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Pick",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Record",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Exclude",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Extract",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Omit",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NonNullable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Parameters",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ConstructorParameters",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReturnType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "InstanceType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uppercase",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Lowercase",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Capitalize",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uncapitalize",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ThisType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBuffer",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferTypes",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferView",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DataView",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DataViewConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int8Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int8ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ClampedArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ClampedArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int16Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int16ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint16Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint16ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float64Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float64ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Intl",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Map",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "MapConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlyMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakMapConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Set",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SetConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlySet",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakSet",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakSetConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SymbolConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorYieldResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorReturnResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Iterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Iterable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IterableIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Generator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "GeneratorFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "GeneratorFunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ProxyHandler",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ProxyConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Reflect",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SharedArrayBuffer",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SharedArrayBufferConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Atomics",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterableIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGenerator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGeneratorFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGeneratorFunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "const",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "defineProps",
+            "identifiers": [],
+            "defs": [],
+            "references": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 11
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                }
+            ]
+        },
+        {
+            "name": "T",
+            "identifiers": [],
+            "defs": [],
+            "references": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 17
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 18
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                }
+            ]
+        }
+    ],
+    "references": [],
+    "childScopes": [
+        {
+            "type": "module",
+            "variables": [],
+            "references": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 11
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 17
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 18
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                }
+            ],
+            "childScopes": [],
+            "through": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 11
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 17
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 18
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                }
+            ]
+        }
+    ],
+    "through": []
+}
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-1/source.vue b/test/fixtures/ast/vue3.3-generic-1/source.vue
new file mode 100644
index 00000000..fc54be37
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-1/source.vue
@@ -0,0 +1,6 @@
+<script setup lang="ts" generic="T">
+defineProps<{foo:T}>()
+</script>
+<template>
+{{foo}}
+</template>
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-1/token-ranges.json b/test/fixtures/ast/vue3.3-generic-1/token-ranges.json
new file mode 100644
index 00000000..debb41a2
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-1/token-ranges.json
@@ -0,0 +1,40 @@
+[
+    "<script setup lang=\"ts\" generic=\"T\">",
+    "defineProps",
+    "<",
+    "{",
+    "foo",
+    ":",
+    "T",
+    "}",
+    ">",
+    "(",
+    ")",
+    "</script>",
+    "<script",
+    "setup",
+    "lang",
+    "=",
+    "\"ts\"",
+    "generic",
+    "=",
+    "\"",
+    "T",
+    "\"",
+    ">",
+    "\n",
+    "defineProps<{foo:T}>()",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<template",
+    ">",
+    "\n",
+    "{{",
+    "foo",
+    "}}",
+    "\n",
+    "</template",
+    ">"
+]
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-1/tree.json b/test/fixtures/ast/vue3.3-generic-1/tree.json
new file mode 100644
index 00000000..eea3840c
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-1/tree.json
@@ -0,0 +1,39 @@
+[
+    {
+        "type": "VElement",
+        "text": "<template>\n{{foo}}\n</template>",
+        "children": [
+            {
+                "type": "VStartTag",
+                "text": "<template>",
+                "children": []
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VExpressionContainer",
+                "text": "{{foo}}",
+                "children": [
+                    {
+                        "type": "Identifier",
+                        "text": "foo",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VEndTag",
+                "text": "</template>",
+                "children": []
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-2/ast.json b/test/fixtures/ast/vue3.3-generic-2/ast.json
new file mode 100644
index 00000000..3685710d
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-2/ast.json
@@ -0,0 +1,2454 @@
+{
+    "type": "Program",
+    "body": [
+        {
+            "type": "TSTypeAliasDeclaration",
+            "id": {
+                "type": "Identifier",
+                "name": "Foo",
+                "range": [
+                    14,
+                    17
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 8
+                    }
+                }
+            },
+            "typeAnnotation": {
+                "type": "TSUnionType",
+                "types": [
+                    {
+                        "type": "TSNumberKeyword",
+                        "range": [
+                            20,
+                            26
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 11
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 17
+                            }
+                        }
+                    },
+                    {
+                        "type": "TSStringKeyword",
+                        "range": [
+                            29,
+                            35
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 20
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 26
+                            }
+                        }
+                    }
+                ],
+                "range": [
+                    20,
+                    35
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 11
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 26
+                    }
+                }
+            },
+            "range": [
+                9,
+                35
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 26
+                }
+            }
+        },
+        {
+            "type": "VariableDeclaration",
+            "declarations": [
+                {
+                    "type": "VariableDeclarator",
+                    "id": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "range": [
+                            101,
+                            102
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "init": {
+                        "type": "CallExpression",
+                        "callee": {
+                            "type": "Identifier",
+                            "name": "defineProps",
+                            "range": [
+                                105,
+                                116
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 5,
+                                    "column": 10
+                                },
+                                "end": {
+                                    "line": 5,
+                                    "column": 21
+                                }
+                            }
+                        },
+                        "arguments": [],
+                        "optional": false,
+                        "range": [
+                            105,
+                            127
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 32
+                            }
+                        },
+                        "typeParameters": {
+                            "type": "TSTypeParameterInstantiation",
+                            "range": [
+                                116,
+                                125
+                            ],
+                            "params": [
+                                {
+                                    "type": "TSTypeLiteral",
+                                    "members": [
+                                        {
+                                            "type": "TSPropertySignature",
+                                            "computed": false,
+                                            "key": {
+                                                "type": "Identifier",
+                                                "name": "foo",
+                                                "range": [
+                                                    118,
+                                                    121
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 5,
+                                                        "column": 23
+                                                    },
+                                                    "end": {
+                                                        "line": 5,
+                                                        "column": 26
+                                                    }
+                                                }
+                                            },
+                                            "typeAnnotation": {
+                                                "type": "TSTypeAnnotation",
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 5,
+                                                        "column": 26
+                                                    },
+                                                    "end": {
+                                                        "line": 5,
+                                                        "column": 28
+                                                    }
+                                                },
+                                                "range": [
+                                                    121,
+                                                    123
+                                                ],
+                                                "typeAnnotation": {
+                                                    "type": "TSTypeReference",
+                                                    "typeName": {
+                                                        "type": "Identifier",
+                                                        "name": "T",
+                                                        "range": [
+                                                            122,
+                                                            123
+                                                        ],
+                                                        "loc": {
+                                                            "start": {
+                                                                "line": 5,
+                                                                "column": 27
+                                                            },
+                                                            "end": {
+                                                                "line": 5,
+                                                                "column": 28
+                                                            }
+                                                        }
+                                                    },
+                                                    "range": [
+                                                        122,
+                                                        123
+                                                    ],
+                                                    "loc": {
+                                                        "start": {
+                                                            "line": 5,
+                                                            "column": 27
+                                                        },
+                                                        "end": {
+                                                            "line": 5,
+                                                            "column": 28
+                                                        }
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                118,
+                                                123
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 5,
+                                                    "column": 23
+                                                },
+                                                "end": {
+                                                    "line": 5,
+                                                    "column": 28
+                                                }
+                                            }
+                                        }
+                                    ],
+                                    "range": [
+                                        117,
+                                        124
+                                    ],
+                                    "loc": {
+                                        "start": {
+                                            "line": 5,
+                                            "column": 22
+                                        },
+                                        "end": {
+                                            "line": 5,
+                                            "column": 29
+                                        }
+                                    }
+                                }
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 5,
+                                    "column": 21
+                                },
+                                "end": {
+                                    "line": 5,
+                                    "column": 30
+                                }
+                            }
+                        }
+                    },
+                    "range": [
+                        101,
+                        127
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 32
+                        }
+                    }
+                }
+            ],
+            "kind": "const",
+            "range": [
+                95,
+                127
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 0
+                },
+                "end": {
+                    "line": 5,
+                    "column": 32
+                }
+            }
+        },
+        {
+            "type": "VariableDeclaration",
+            "declarations": [
+                {
+                    "type": "VariableDeclarator",
+                    "id": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            134,
+                            137
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "init": {
+                        "type": "MemberExpression",
+                        "object": {
+                            "type": "Identifier",
+                            "name": "p",
+                            "range": [
+                                140,
+                                141
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 6,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "line": 6,
+                                    "column": 13
+                                }
+                            }
+                        },
+                        "property": {
+                            "type": "Identifier",
+                            "name": "foo",
+                            "range": [
+                                142,
+                                145
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 6,
+                                    "column": 14
+                                },
+                                "end": {
+                                    "line": 6,
+                                    "column": 17
+                                }
+                            }
+                        },
+                        "computed": false,
+                        "optional": false,
+                        "range": [
+                            140,
+                            145
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 17
+                            }
+                        }
+                    },
+                    "range": [
+                        134,
+                        145
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 17
+                        }
+                    }
+                }
+            ],
+            "kind": "const",
+            "range": [
+                128,
+                145
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 17
+                }
+            }
+        },
+        {
+            "type": "ExpressionStatement",
+            "expression": {
+                "type": "CallExpression",
+                "callee": {
+                    "type": "MemberExpression",
+                    "object": {
+                        "type": "Identifier",
+                        "name": "console",
+                        "range": [
+                            146,
+                            153
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "property": {
+                        "type": "Identifier",
+                        "name": "log",
+                        "range": [
+                            154,
+                            157
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 8
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 11
+                            }
+                        }
+                    },
+                    "computed": false,
+                    "optional": false,
+                    "range": [
+                        146,
+                        157
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 11
+                        }
+                    }
+                },
+                "arguments": [
+                    {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            158,
+                            161
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 15
+                            }
+                        }
+                    }
+                ],
+                "optional": false,
+                "range": [
+                    146,
+                    162
+                ],
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 16
+                    }
+                }
+            },
+            "range": [
+                146,
+                162
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 0
+                },
+                "end": {
+                    "line": 7,
+                    "column": 16
+                }
+            }
+        }
+    ],
+    "sourceType": "module",
+    "range": [
+        9,
+        162
+    ],
+    "loc": {
+        "start": {
+            "line": 2,
+            "column": 0
+        },
+        "end": {
+            "line": 7,
+            "column": 16
+        }
+    },
+    "tokens": [
+        {
+            "type": "Punctuator",
+            "range": [
+                0,
+                8
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 1,
+                    "column": 8
+                }
+            },
+            "value": "<script>"
+        },
+        {
+            "type": "Identifier",
+            "value": "type",
+            "range": [
+                9,
+                13
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 4
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "Foo",
+            "range": [
+                14,
+                17
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 5
+                },
+                "end": {
+                    "line": 2,
+                    "column": 8
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "=",
+            "range": [
+                18,
+                19
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 9
+                },
+                "end": {
+                    "line": 2,
+                    "column": 10
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "number",
+            "range": [
+                20,
+                26
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 11
+                },
+                "end": {
+                    "line": 2,
+                    "column": 17
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "|",
+            "range": [
+                27,
+                28
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 18
+                },
+                "end": {
+                    "line": 2,
+                    "column": 19
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "string",
+            "range": [
+                29,
+                35
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 20
+                },
+                "end": {
+                    "line": 2,
+                    "column": 26
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                36,
+                45
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "value": "</script>"
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                46,
+                94
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 4,
+                    "column": 48
+                }
+            },
+            "value": "<script>"
+        },
+        {
+            "type": "Keyword",
+            "value": "const",
+            "range": [
+                95,
+                100
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 0
+                },
+                "end": {
+                    "line": 5,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "p",
+            "range": [
+                101,
+                102
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 6
+                },
+                "end": {
+                    "line": 5,
+                    "column": 7
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "=",
+            "range": [
+                103,
+                104
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 8
+                },
+                "end": {
+                    "line": 5,
+                    "column": 9
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "defineProps",
+            "range": [
+                105,
+                116
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 10
+                },
+                "end": {
+                    "line": 5,
+                    "column": 21
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "<",
+            "range": [
+                116,
+                117
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 21
+                },
+                "end": {
+                    "line": 5,
+                    "column": 22
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "{",
+            "range": [
+                117,
+                118
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 22
+                },
+                "end": {
+                    "line": 5,
+                    "column": 23
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                118,
+                121
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 23
+                },
+                "end": {
+                    "line": 5,
+                    "column": 26
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ":",
+            "range": [
+                121,
+                122
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 26
+                },
+                "end": {
+                    "line": 5,
+                    "column": 27
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                122,
+                123
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 27
+                },
+                "end": {
+                    "line": 5,
+                    "column": 28
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "}",
+            "range": [
+                123,
+                124
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 28
+                },
+                "end": {
+                    "line": 5,
+                    "column": 29
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ">",
+            "range": [
+                124,
+                125
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 29
+                },
+                "end": {
+                    "line": 5,
+                    "column": 30
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "(",
+            "range": [
+                125,
+                126
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 30
+                },
+                "end": {
+                    "line": 5,
+                    "column": 31
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ")",
+            "range": [
+                126,
+                127
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 31
+                },
+                "end": {
+                    "line": 5,
+                    "column": 32
+                }
+            }
+        },
+        {
+            "type": "Keyword",
+            "value": "const",
+            "range": [
+                128,
+                133
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                134,
+                137
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 6
+                },
+                "end": {
+                    "line": 6,
+                    "column": 9
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "=",
+            "range": [
+                138,
+                139
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 10
+                },
+                "end": {
+                    "line": 6,
+                    "column": 11
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "p",
+            "range": [
+                140,
+                141
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 12
+                },
+                "end": {
+                    "line": 6,
+                    "column": 13
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ".",
+            "range": [
+                141,
+                142
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 13
+                },
+                "end": {
+                    "line": 6,
+                    "column": 14
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                142,
+                145
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 14
+                },
+                "end": {
+                    "line": 6,
+                    "column": 17
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "console",
+            "range": [
+                146,
+                153
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 0
+                },
+                "end": {
+                    "line": 7,
+                    "column": 7
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ".",
+            "range": [
+                153,
+                154
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 7
+                },
+                "end": {
+                    "line": 7,
+                    "column": 8
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "log",
+            "range": [
+                154,
+                157
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 8
+                },
+                "end": {
+                    "line": 7,
+                    "column": 11
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "(",
+            "range": [
+                157,
+                158
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 11
+                },
+                "end": {
+                    "line": 7,
+                    "column": 12
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                158,
+                161
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 12
+                },
+                "end": {
+                    "line": 7,
+                    "column": 15
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ")",
+            "range": [
+                161,
+                162
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 15
+                },
+                "end": {
+                    "line": 7,
+                    "column": 16
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                163,
+                172
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 0
+                },
+                "end": {
+                    "line": 8,
+                    "column": 9
+                }
+            },
+            "value": "</script>"
+        }
+    ],
+    "comments": [],
+    "templateBody": {
+        "type": "VElement",
+        "range": [
+            173,
+            203
+        ],
+        "loc": {
+            "start": {
+                "line": 9,
+                "column": 0
+            },
+            "end": {
+                "line": 11,
+                "column": 11
+            }
+        },
+        "name": "template",
+        "rawName": "template",
+        "namespace": "http://www.w3.org/1999/xhtml",
+        "startTag": {
+            "type": "VStartTag",
+            "range": [
+                173,
+                183
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 0
+                },
+                "end": {
+                    "line": 9,
+                    "column": 10
+                }
+            },
+            "selfClosing": false,
+            "attributes": []
+        },
+        "children": [
+            {
+                "type": "VText",
+                "range": [
+                    183,
+                    184
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "VExpressionContainer",
+                "range": [
+                    184,
+                    191
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 7
+                    }
+                },
+                "expression": {
+                    "type": "Identifier",
+                    "name": "foo",
+                    "range": [
+                        186,
+                        189
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 5
+                        }
+                    }
+                },
+                "references": [
+                    {
+                        "id": {
+                            "type": "Identifier",
+                            "name": "foo",
+                            "range": [
+                                186,
+                                189
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 10,
+                                    "column": 2
+                                },
+                                "end": {
+                                    "line": 10,
+                                    "column": 5
+                                }
+                            }
+                        },
+                        "mode": "r",
+                        "isValueReference": true,
+                        "isTypeReference": false
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "range": [
+                    191,
+                    192
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            }
+        ],
+        "endTag": {
+            "type": "VEndTag",
+            "range": [
+                192,
+                203
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 0
+                },
+                "end": {
+                    "line": 11,
+                    "column": 11
+                }
+            }
+        },
+        "variables": [],
+        "tokens": [
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    0,
+                    7
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 7
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    7,
+                    8
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 8
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    8,
+                    9
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    9,
+                    13
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 4
+                    }
+                },
+                "value": "type"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    13,
+                    14
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 4
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 5
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    14,
+                    17
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 8
+                    }
+                },
+                "value": "Foo"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    17,
+                    18
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 9
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    18,
+                    19
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 10
+                    }
+                },
+                "value": "="
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    19,
+                    20
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 11
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    20,
+                    26
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 11
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 17
+                    }
+                },
+                "value": "number"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    26,
+                    27
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 17
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 18
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    27,
+                    28
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 18
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 19
+                    }
+                },
+                "value": "|"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    28,
+                    29
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 19
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 20
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    29,
+                    35
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 20
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 26
+                    }
+                },
+                "value": "string"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    35,
+                    36
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 26
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    36,
+                    44
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 8
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    44,
+                    45
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 9
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    45,
+                    46
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    46,
+                    53
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 7
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    54,
+                    59
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 13
+                    }
+                },
+                "value": "setup"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    60,
+                    64
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 14
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 18
+                    }
+                },
+                "value": "lang"
+            },
+            {
+                "type": "HTMLAssociation",
+                "range": [
+                    64,
+                    65
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 18
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 19
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLLiteral",
+                "range": [
+                    65,
+                    69
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 19
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 23
+                    }
+                },
+                "value": "ts"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    70,
+                    77
+                ],
+                "loc": {
+                    "start": {
+                        "column": 24,
+                        "line": 4
+                    },
+                    "end": {
+                        "column": 31,
+                        "line": 4
+                    }
+                },
+                "value": "generic"
+            },
+            {
+                "type": "HTMLAssociation",
+                "range": [
+                    77,
+                    78
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 31
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 32
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "Punctuator",
+                "range": [
+                    78,
+                    79
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 32
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 33
+                    }
+                },
+                "value": "\""
+            },
+            {
+                "type": "Identifier",
+                "value": "T",
+                "range": [
+                    79,
+                    80
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 33
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 34
+                    }
+                }
+            },
+            {
+                "type": "Keyword",
+                "value": "extends",
+                "range": [
+                    81,
+                    88
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 35
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 42
+                    }
+                }
+            },
+            {
+                "type": "Identifier",
+                "value": "Foo",
+                "range": [
+                    89,
+                    92
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 43
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 46
+                    }
+                }
+            },
+            {
+                "type": "Punctuator",
+                "range": [
+                    92,
+                    93
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 46
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 47
+                    }
+                },
+                "value": "\""
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    93,
+                    94
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 47
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 48
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    94,
+                    95
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 48
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    95,
+                    100
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 5
+                    }
+                },
+                "value": "const"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    100,
+                    101
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 6
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    101,
+                    102
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 6
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 7
+                    }
+                },
+                "value": "p"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    102,
+                    103
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 8
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    103,
+                    104
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 9
+                    }
+                },
+                "value": "="
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    104,
+                    105
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 10
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    105,
+                    127
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 32
+                    }
+                },
+                "value": "defineProps<{foo:T}>()"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    127,
+                    128
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 32
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    128,
+                    133
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 5
+                    }
+                },
+                "value": "const"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    133,
+                    134
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 6
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    134,
+                    137
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 6
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 9
+                    }
+                },
+                "value": "foo"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    137,
+                    138
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 10
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    138,
+                    139
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 11
+                    }
+                },
+                "value": "="
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    139,
+                    140
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 11
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 12
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    140,
+                    145
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 12
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 17
+                    }
+                },
+                "value": "p.foo"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    145,
+                    146
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 17
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    146,
+                    162
+                ],
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 16
+                    }
+                },
+                "value": "console.log(foo)"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    162,
+                    163
+                ],
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 16
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    163,
+                    171
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 8
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    171,
+                    172
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 9
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    172,
+                    173
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    173,
+                    182
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 9
+                    }
+                },
+                "value": "template"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    182,
+                    183
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 10
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    183,
+                    184
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "VExpressionStart",
+                "range": [
+                    184,
+                    186
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 2
+                    }
+                },
+                "value": "{{"
+            },
+            {
+                "type": "Identifier",
+                "value": "foo",
+                "range": [
+                    186,
+                    189
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 2
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 5
+                    }
+                }
+            },
+            {
+                "type": "VExpressionEnd",
+                "range": [
+                    189,
+                    191
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 7
+                    }
+                },
+                "value": "}}"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    191,
+                    192
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    192,
+                    202
+                ],
+                "loc": {
+                    "start": {
+                        "line": 11,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 10
+                    }
+                },
+                "value": "template"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    202,
+                    203
+                ],
+                "loc": {
+                    "start": {
+                        "line": 11,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 11
+                    }
+                },
+                "value": ""
+            }
+        ],
+        "comments": [],
+        "errors": []
+    }
+}
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-2/parser-options.json b/test/fixtures/ast/vue3.3-generic-2/parser-options.json
new file mode 100644
index 00000000..0ead30e9
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-2/parser-options.json
@@ -0,0 +1,6 @@
+{
+  "sourceType": "module",
+  "parser": {
+    "ts": "@typescript-eslint/parser"
+  }
+}
diff --git a/test/fixtures/ast/vue3.3-generic-2/scope.json b/test/fixtures/ast/vue3.3-generic-2/scope.json
new file mode 100644
index 00000000..9629ab05
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-2/scope.json
@@ -0,0 +1,1519 @@
+{
+    "type": "global",
+    "variables": [
+        {
+            "name": "ClassMemberDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassMethodDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassGetterDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassSetterDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorTarget",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassFieldDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "MethodDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ParameterDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Symbol",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyKey",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDescriptor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDescriptorMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Object",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ObjectConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Function",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "FunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ThisParameterType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "OmitThisParameter",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "CallableFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NewableFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IArguments",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "String",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "StringConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Boolean",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "BooleanConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Number",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NumberConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TemplateStringsArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportMeta",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportCallOptions",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportAssertions",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Math",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Date",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DateConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpMatchArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpExecArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExp",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Error",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "EvalError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "EvalErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RangeError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RangeErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReferenceError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReferenceErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SyntaxError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SyntaxErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypeError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypeErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "URIError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "URIErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "JSON",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlyArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ConcatArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypedPropertyDescriptor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseConstructorLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Promise",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Awaited",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Partial",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Required",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Readonly",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Pick",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Record",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Exclude",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Extract",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Omit",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NonNullable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Parameters",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ConstructorParameters",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReturnType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "InstanceType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uppercase",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Lowercase",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Capitalize",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uncapitalize",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ThisType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBuffer",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferTypes",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferView",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DataView",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DataViewConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int8Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int8ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ClampedArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ClampedArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int16Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int16ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint16Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint16ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float64Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float64ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Intl",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Map",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "MapConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlyMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakMapConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Set",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SetConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlySet",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakSet",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakSetConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SymbolConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorYieldResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorReturnResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Iterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Iterable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IterableIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Generator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "GeneratorFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "GeneratorFunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ProxyHandler",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ProxyConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Reflect",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SharedArrayBuffer",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SharedArrayBufferConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Atomics",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterableIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGenerator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGeneratorFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGeneratorFunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "const",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "defineProps",
+            "identifiers": [],
+            "defs": [],
+            "references": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 21
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                }
+            ]
+        }
+    ],
+    "references": [],
+    "childScopes": [
+        {
+            "type": "module",
+            "variables": [
+                {
+                    "name": "Foo",
+                    "identifiers": [
+                        {
+                            "type": "Identifier",
+                            "name": "Foo",
+                            "loc": {
+                                "start": {
+                                    "line": 2,
+                                    "column": 5
+                                },
+                                "end": {
+                                    "line": 2,
+                                    "column": 8
+                                }
+                            }
+                        }
+                    ],
+                    "defs": [
+                        {
+                            "type": "Type",
+                            "node": {
+                                "type": "TSTypeAliasDeclaration",
+                                "loc": {
+                                    "start": {
+                                        "line": 2,
+                                        "column": 0
+                                    },
+                                    "end": {
+                                        "line": 2,
+                                        "column": 26
+                                    }
+                                }
+                            },
+                            "name": "Foo"
+                        }
+                    ],
+                    "references": [
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "Foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 2,
+                                        "column": 5
+                                    },
+                                    "end": {
+                                        "line": 2,
+                                        "column": 8
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "Foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 2,
+                                        "column": 5
+                                    },
+                                    "end": {
+                                        "line": 2,
+                                        "column": 8
+                                    }
+                                }
+                            },
+                            "init": null,
+                            "vueUsedInTemplate": true
+                        }
+                    ]
+                },
+                {
+                    "name": "p",
+                    "identifiers": [
+                        {
+                            "type": "Identifier",
+                            "name": "p",
+                            "loc": {
+                                "start": {
+                                    "line": 5,
+                                    "column": 6
+                                },
+                                "end": {
+                                    "line": 5,
+                                    "column": 7
+                                }
+                            }
+                        }
+                    ],
+                    "defs": [
+                        {
+                            "type": "Variable",
+                            "node": {
+                                "type": "VariableDeclarator",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 32
+                                    }
+                                }
+                            },
+                            "name": "p"
+                        }
+                    ],
+                    "references": [
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 7
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 7
+                                    }
+                                }
+                            },
+                            "init": true
+                        },
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 12
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 13
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 7
+                                    }
+                                }
+                            },
+                            "init": null
+                        }
+                    ]
+                },
+                {
+                    "name": "foo",
+                    "identifiers": [
+                        {
+                            "type": "Identifier",
+                            "name": "foo",
+                            "loc": {
+                                "start": {
+                                    "line": 6,
+                                    "column": 6
+                                },
+                                "end": {
+                                    "line": 6,
+                                    "column": 9
+                                }
+                            }
+                        }
+                    ],
+                    "defs": [
+                        {
+                            "type": "Variable",
+                            "node": {
+                                "type": "VariableDeclarator",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 17
+                                    }
+                                }
+                            },
+                            "name": "foo"
+                        }
+                    ],
+                    "references": [
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "init": true
+                        },
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 7,
+                                        "column": 12
+                                    },
+                                    "end": {
+                                        "line": 7,
+                                        "column": 15
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "init": null
+                        },
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "init": null,
+                            "vueUsedInTemplate": true
+                        }
+                    ]
+                }
+            ],
+            "references": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "init": true
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 21
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 27
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 28
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "init": true
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 13
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "console",
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 15
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "init": null
+                }
+            ],
+            "childScopes": [],
+            "through": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 21
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 27
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 28
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "console",
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                }
+            ]
+        }
+    ],
+    "through": [
+        {
+            "identifier": {
+                "type": "Identifier",
+                "name": "T",
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 27
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 28
+                    }
+                }
+            },
+            "from": "module",
+            "resolved": null,
+            "init": null
+        },
+        {
+            "identifier": {
+                "type": "Identifier",
+                "name": "console",
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 7
+                    }
+                }
+            },
+            "from": "module",
+            "resolved": null,
+            "init": null
+        }
+    ]
+}
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-2/source.vue b/test/fixtures/ast/vue3.3-generic-2/source.vue
new file mode 100644
index 00000000..e42bea85
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-2/source.vue
@@ -0,0 +1,11 @@
+<script>
+type Foo = number | string
+</script>
+<script setup lang="ts" generic="T extends Foo">
+const p = defineProps<{foo:T}>()
+const foo = p.foo
+console.log(foo)
+</script>
+<template>
+{{foo}}
+</template>
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-2/token-ranges.json b/test/fixtures/ast/vue3.3-generic-2/token-ranges.json
new file mode 100644
index 00000000..8c7613a8
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-2/token-ranges.json
@@ -0,0 +1,99 @@
+[
+    "<script>",
+    "type",
+    "Foo",
+    "=",
+    "number",
+    "|",
+    "string",
+    "</script>",
+    "<script setup lang=\"ts\" generic=\"T extends Foo\">",
+    "const",
+    "p",
+    "=",
+    "defineProps",
+    "<",
+    "{",
+    "foo",
+    ":",
+    "T",
+    "}",
+    ">",
+    "(",
+    ")",
+    "const",
+    "foo",
+    "=",
+    "p",
+    ".",
+    "foo",
+    "console",
+    ".",
+    "log",
+    "(",
+    "foo",
+    ")",
+    "</script>",
+    "<script",
+    ">",
+    "\n",
+    "type",
+    " ",
+    "Foo",
+    " ",
+    "=",
+    " ",
+    "number",
+    " ",
+    "|",
+    " ",
+    "string",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<script",
+    "setup",
+    "lang",
+    "=",
+    "\"ts\"",
+    "generic",
+    "=",
+    "\"",
+    "T",
+    "extends",
+    "Foo",
+    "\"",
+    ">",
+    "\n",
+    "const",
+    " ",
+    "p",
+    " ",
+    "=",
+    " ",
+    "defineProps<{foo:T}>()",
+    "\n",
+    "const",
+    " ",
+    "foo",
+    " ",
+    "=",
+    " ",
+    "p.foo",
+    "\n",
+    "console.log(foo)",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<template",
+    ">",
+    "\n",
+    "{{",
+    "foo",
+    "}}",
+    "\n",
+    "</template",
+    ">"
+]
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-2/tree.json b/test/fixtures/ast/vue3.3-generic-2/tree.json
new file mode 100644
index 00000000..eea3840c
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-2/tree.json
@@ -0,0 +1,39 @@
+[
+    {
+        "type": "VElement",
+        "text": "<template>\n{{foo}}\n</template>",
+        "children": [
+            {
+                "type": "VStartTag",
+                "text": "<template>",
+                "children": []
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VExpressionContainer",
+                "text": "{{foo}}",
+                "children": [
+                    {
+                        "type": "Identifier",
+                        "text": "foo",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VEndTag",
+                "text": "</template>",
+                "children": []
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-3/ast.json b/test/fixtures/ast/vue3.3-generic-3/ast.json
new file mode 100644
index 00000000..8dbd9da4
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-3/ast.json
@@ -0,0 +1,2758 @@
+{
+    "type": "Program",
+    "body": [
+        {
+            "type": "TSTypeAliasDeclaration",
+            "id": {
+                "type": "Identifier",
+                "name": "Foo",
+                "range": [
+                    14,
+                    17
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 8
+                    }
+                }
+            },
+            "typeAnnotation": {
+                "type": "TSUnionType",
+                "types": [
+                    {
+                        "type": "TSNumberKeyword",
+                        "range": [
+                            20,
+                            26
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 11
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 17
+                            }
+                        }
+                    },
+                    {
+                        "type": "TSStringKeyword",
+                        "range": [
+                            29,
+                            35
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 20
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 26
+                            }
+                        }
+                    }
+                ],
+                "range": [
+                    20,
+                    35
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 11
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 26
+                    }
+                }
+            },
+            "range": [
+                9,
+                35
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 26
+                }
+            }
+        },
+        {
+            "type": "VariableDeclaration",
+            "declarations": [
+                {
+                    "type": "VariableDeclarator",
+                    "id": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "range": [
+                            114,
+                            115
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "init": {
+                        "type": "CallExpression",
+                        "callee": {
+                            "type": "Identifier",
+                            "name": "defineProps",
+                            "range": [
+                                118,
+                                129
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 5,
+                                    "column": 10
+                                },
+                                "end": {
+                                    "line": 5,
+                                    "column": 21
+                                }
+                            }
+                        },
+                        "arguments": [],
+                        "optional": false,
+                        "range": [
+                            118,
+                            148
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 40
+                            }
+                        },
+                        "typeParameters": {
+                            "type": "TSTypeParameterInstantiation",
+                            "range": [
+                                129,
+                                146
+                            ],
+                            "params": [
+                                {
+                                    "type": "TSTypeLiteral",
+                                    "members": [
+                                        {
+                                            "type": "TSPropertySignature",
+                                            "computed": false,
+                                            "key": {
+                                                "type": "Identifier",
+                                                "name": "foo",
+                                                "range": [
+                                                    131,
+                                                    134
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 5,
+                                                        "column": 23
+                                                    },
+                                                    "end": {
+                                                        "line": 5,
+                                                        "column": 26
+                                                    }
+                                                }
+                                            },
+                                            "typeAnnotation": {
+                                                "type": "TSTypeAnnotation",
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 5,
+                                                        "column": 26
+                                                    },
+                                                    "end": {
+                                                        "line": 5,
+                                                        "column": 28
+                                                    }
+                                                },
+                                                "range": [
+                                                    134,
+                                                    136
+                                                ],
+                                                "typeAnnotation": {
+                                                    "type": "TSTypeReference",
+                                                    "typeName": {
+                                                        "type": "Identifier",
+                                                        "name": "T",
+                                                        "range": [
+                                                            135,
+                                                            136
+                                                        ],
+                                                        "loc": {
+                                                            "start": {
+                                                                "line": 5,
+                                                                "column": 27
+                                                            },
+                                                            "end": {
+                                                                "line": 5,
+                                                                "column": 28
+                                                            }
+                                                        }
+                                                    },
+                                                    "range": [
+                                                        135,
+                                                        136
+                                                    ],
+                                                    "loc": {
+                                                        "start": {
+                                                            "line": 5,
+                                                            "column": 27
+                                                        },
+                                                        "end": {
+                                                            "line": 5,
+                                                            "column": 28
+                                                        }
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                131,
+                                                137
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 5,
+                                                    "column": 23
+                                                },
+                                                "end": {
+                                                    "line": 5,
+                                                    "column": 29
+                                                }
+                                            }
+                                        },
+                                        {
+                                            "type": "TSPropertySignature",
+                                            "computed": false,
+                                            "key": {
+                                                "type": "Identifier",
+                                                "name": "bar",
+                                                "range": [
+                                                    138,
+                                                    141
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 5,
+                                                        "column": 30
+                                                    },
+                                                    "end": {
+                                                        "line": 5,
+                                                        "column": 33
+                                                    }
+                                                }
+                                            },
+                                            "typeAnnotation": {
+                                                "type": "TSTypeAnnotation",
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 5,
+                                                        "column": 33
+                                                    },
+                                                    "end": {
+                                                        "line": 5,
+                                                        "column": 36
+                                                    }
+                                                },
+                                                "range": [
+                                                    141,
+                                                    144
+                                                ],
+                                                "typeAnnotation": {
+                                                    "type": "TSTypeReference",
+                                                    "typeName": {
+                                                        "type": "Identifier",
+                                                        "name": "U",
+                                                        "range": [
+                                                            143,
+                                                            144
+                                                        ],
+                                                        "loc": {
+                                                            "start": {
+                                                                "line": 5,
+                                                                "column": 35
+                                                            },
+                                                            "end": {
+                                                                "line": 5,
+                                                                "column": 36
+                                                            }
+                                                        }
+                                                    },
+                                                    "range": [
+                                                        143,
+                                                        144
+                                                    ],
+                                                    "loc": {
+                                                        "start": {
+                                                            "line": 5,
+                                                            "column": 35
+                                                        },
+                                                        "end": {
+                                                            "line": 5,
+                                                            "column": 36
+                                                        }
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                138,
+                                                144
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 5,
+                                                    "column": 30
+                                                },
+                                                "end": {
+                                                    "line": 5,
+                                                    "column": 36
+                                                }
+                                            }
+                                        }
+                                    ],
+                                    "range": [
+                                        130,
+                                        145
+                                    ],
+                                    "loc": {
+                                        "start": {
+                                            "line": 5,
+                                            "column": 22
+                                        },
+                                        "end": {
+                                            "line": 5,
+                                            "column": 37
+                                        }
+                                    }
+                                }
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 5,
+                                    "column": 21
+                                },
+                                "end": {
+                                    "line": 5,
+                                    "column": 38
+                                }
+                            }
+                        }
+                    },
+                    "range": [
+                        114,
+                        148
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 40
+                        }
+                    }
+                }
+            ],
+            "kind": "const",
+            "range": [
+                108,
+                148
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 0
+                },
+                "end": {
+                    "line": 5,
+                    "column": 40
+                }
+            }
+        },
+        {
+            "type": "VariableDeclaration",
+            "declarations": [
+                {
+                    "type": "VariableDeclarator",
+                    "id": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            155,
+                            158
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "init": {
+                        "type": "MemberExpression",
+                        "object": {
+                            "type": "Identifier",
+                            "name": "p",
+                            "range": [
+                                161,
+                                162
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 6,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "line": 6,
+                                    "column": 13
+                                }
+                            }
+                        },
+                        "property": {
+                            "type": "Identifier",
+                            "name": "foo",
+                            "range": [
+                                163,
+                                166
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 6,
+                                    "column": 14
+                                },
+                                "end": {
+                                    "line": 6,
+                                    "column": 17
+                                }
+                            }
+                        },
+                        "computed": false,
+                        "optional": false,
+                        "range": [
+                            161,
+                            166
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 17
+                            }
+                        }
+                    },
+                    "range": [
+                        155,
+                        166
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 17
+                        }
+                    }
+                }
+            ],
+            "kind": "const",
+            "range": [
+                149,
+                166
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 17
+                }
+            }
+        },
+        {
+            "type": "ExpressionStatement",
+            "expression": {
+                "type": "CallExpression",
+                "callee": {
+                    "type": "MemberExpression",
+                    "object": {
+                        "type": "Identifier",
+                        "name": "console",
+                        "range": [
+                            167,
+                            174
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "property": {
+                        "type": "Identifier",
+                        "name": "log",
+                        "range": [
+                            175,
+                            178
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 8
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 11
+                            }
+                        }
+                    },
+                    "computed": false,
+                    "optional": false,
+                    "range": [
+                        167,
+                        178
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 11
+                        }
+                    }
+                },
+                "arguments": [
+                    {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            179,
+                            182
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 15
+                            }
+                        }
+                    }
+                ],
+                "optional": false,
+                "range": [
+                    167,
+                    183
+                ],
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 16
+                    }
+                }
+            },
+            "range": [
+                167,
+                183
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 0
+                },
+                "end": {
+                    "line": 7,
+                    "column": 16
+                }
+            }
+        }
+    ],
+    "sourceType": "module",
+    "range": [
+        9,
+        183
+    ],
+    "loc": {
+        "start": {
+            "line": 2,
+            "column": 0
+        },
+        "end": {
+            "line": 7,
+            "column": 16
+        }
+    },
+    "tokens": [
+        {
+            "type": "Punctuator",
+            "range": [
+                0,
+                8
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 1,
+                    "column": 8
+                }
+            },
+            "value": "<script>"
+        },
+        {
+            "type": "Identifier",
+            "value": "type",
+            "range": [
+                9,
+                13
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 4
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "Foo",
+            "range": [
+                14,
+                17
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 5
+                },
+                "end": {
+                    "line": 2,
+                    "column": 8
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "=",
+            "range": [
+                18,
+                19
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 9
+                },
+                "end": {
+                    "line": 2,
+                    "column": 10
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "number",
+            "range": [
+                20,
+                26
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 11
+                },
+                "end": {
+                    "line": 2,
+                    "column": 17
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "|",
+            "range": [
+                27,
+                28
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 18
+                },
+                "end": {
+                    "line": 2,
+                    "column": 19
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "string",
+            "range": [
+                29,
+                35
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 20
+                },
+                "end": {
+                    "line": 2,
+                    "column": 26
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                36,
+                45
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "value": "</script>"
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                46,
+                107
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 4,
+                    "column": 61
+                }
+            },
+            "value": "<script>"
+        },
+        {
+            "type": "Keyword",
+            "value": "const",
+            "range": [
+                108,
+                113
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 0
+                },
+                "end": {
+                    "line": 5,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "p",
+            "range": [
+                114,
+                115
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 6
+                },
+                "end": {
+                    "line": 5,
+                    "column": 7
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "=",
+            "range": [
+                116,
+                117
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 8
+                },
+                "end": {
+                    "line": 5,
+                    "column": 9
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "defineProps",
+            "range": [
+                118,
+                129
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 10
+                },
+                "end": {
+                    "line": 5,
+                    "column": 21
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "<",
+            "range": [
+                129,
+                130
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 21
+                },
+                "end": {
+                    "line": 5,
+                    "column": 22
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "{",
+            "range": [
+                130,
+                131
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 22
+                },
+                "end": {
+                    "line": 5,
+                    "column": 23
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                131,
+                134
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 23
+                },
+                "end": {
+                    "line": 5,
+                    "column": 26
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ":",
+            "range": [
+                134,
+                135
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 26
+                },
+                "end": {
+                    "line": 5,
+                    "column": 27
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                135,
+                136
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 27
+                },
+                "end": {
+                    "line": 5,
+                    "column": 28
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ",",
+            "range": [
+                136,
+                137
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 28
+                },
+                "end": {
+                    "line": 5,
+                    "column": 29
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "bar",
+            "range": [
+                138,
+                141
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 30
+                },
+                "end": {
+                    "line": 5,
+                    "column": 33
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ":",
+            "range": [
+                141,
+                142
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 33
+                },
+                "end": {
+                    "line": 5,
+                    "column": 34
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "U",
+            "range": [
+                143,
+                144
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 35
+                },
+                "end": {
+                    "line": 5,
+                    "column": 36
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "}",
+            "range": [
+                144,
+                145
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 36
+                },
+                "end": {
+                    "line": 5,
+                    "column": 37
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ">",
+            "range": [
+                145,
+                146
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 37
+                },
+                "end": {
+                    "line": 5,
+                    "column": 38
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "(",
+            "range": [
+                146,
+                147
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 38
+                },
+                "end": {
+                    "line": 5,
+                    "column": 39
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ")",
+            "range": [
+                147,
+                148
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 39
+                },
+                "end": {
+                    "line": 5,
+                    "column": 40
+                }
+            }
+        },
+        {
+            "type": "Keyword",
+            "value": "const",
+            "range": [
+                149,
+                154
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                155,
+                158
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 6
+                },
+                "end": {
+                    "line": 6,
+                    "column": 9
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "=",
+            "range": [
+                159,
+                160
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 10
+                },
+                "end": {
+                    "line": 6,
+                    "column": 11
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "p",
+            "range": [
+                161,
+                162
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 12
+                },
+                "end": {
+                    "line": 6,
+                    "column": 13
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ".",
+            "range": [
+                162,
+                163
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 13
+                },
+                "end": {
+                    "line": 6,
+                    "column": 14
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                163,
+                166
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 14
+                },
+                "end": {
+                    "line": 6,
+                    "column": 17
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "console",
+            "range": [
+                167,
+                174
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 0
+                },
+                "end": {
+                    "line": 7,
+                    "column": 7
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ".",
+            "range": [
+                174,
+                175
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 7
+                },
+                "end": {
+                    "line": 7,
+                    "column": 8
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "log",
+            "range": [
+                175,
+                178
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 8
+                },
+                "end": {
+                    "line": 7,
+                    "column": 11
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": "(",
+            "range": [
+                178,
+                179
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 11
+                },
+                "end": {
+                    "line": 7,
+                    "column": 12
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                179,
+                182
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 12
+                },
+                "end": {
+                    "line": 7,
+                    "column": 15
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ")",
+            "range": [
+                182,
+                183
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 15
+                },
+                "end": {
+                    "line": 7,
+                    "column": 16
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                184,
+                193
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 0
+                },
+                "end": {
+                    "line": 8,
+                    "column": 9
+                }
+            },
+            "value": "</script>"
+        }
+    ],
+    "comments": [],
+    "templateBody": {
+        "type": "VElement",
+        "range": [
+            194,
+            224
+        ],
+        "loc": {
+            "start": {
+                "line": 9,
+                "column": 0
+            },
+            "end": {
+                "line": 11,
+                "column": 11
+            }
+        },
+        "name": "template",
+        "rawName": "template",
+        "namespace": "http://www.w3.org/1999/xhtml",
+        "startTag": {
+            "type": "VStartTag",
+            "range": [
+                194,
+                204
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 0
+                },
+                "end": {
+                    "line": 9,
+                    "column": 10
+                }
+            },
+            "selfClosing": false,
+            "attributes": []
+        },
+        "children": [
+            {
+                "type": "VText",
+                "range": [
+                    204,
+                    205
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "VExpressionContainer",
+                "range": [
+                    205,
+                    212
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 7
+                    }
+                },
+                "expression": {
+                    "type": "Identifier",
+                    "name": "foo",
+                    "range": [
+                        207,
+                        210
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 5
+                        }
+                    }
+                },
+                "references": [
+                    {
+                        "id": {
+                            "type": "Identifier",
+                            "name": "foo",
+                            "range": [
+                                207,
+                                210
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 10,
+                                    "column": 2
+                                },
+                                "end": {
+                                    "line": 10,
+                                    "column": 5
+                                }
+                            }
+                        },
+                        "mode": "r",
+                        "isValueReference": true,
+                        "isTypeReference": false
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "range": [
+                    212,
+                    213
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            }
+        ],
+        "endTag": {
+            "type": "VEndTag",
+            "range": [
+                213,
+                224
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 0
+                },
+                "end": {
+                    "line": 11,
+                    "column": 11
+                }
+            }
+        },
+        "variables": [],
+        "tokens": [
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    0,
+                    7
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 7
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    7,
+                    8
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 8
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    8,
+                    9
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    9,
+                    13
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 4
+                    }
+                },
+                "value": "type"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    13,
+                    14
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 4
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 5
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    14,
+                    17
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 8
+                    }
+                },
+                "value": "Foo"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    17,
+                    18
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 9
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    18,
+                    19
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 10
+                    }
+                },
+                "value": "="
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    19,
+                    20
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 11
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    20,
+                    26
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 11
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 17
+                    }
+                },
+                "value": "number"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    26,
+                    27
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 17
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 18
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    27,
+                    28
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 18
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 19
+                    }
+                },
+                "value": "|"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    28,
+                    29
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 19
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 20
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    29,
+                    35
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 20
+                    },
+                    "end": {
+                        "line": 2,
+                        "column": 26
+                    }
+                },
+                "value": "string"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    35,
+                    36
+                ],
+                "loc": {
+                    "start": {
+                        "line": 2,
+                        "column": 26
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    36,
+                    44
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 8
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    44,
+                    45
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 9
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    45,
+                    46
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    46,
+                    53
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 7
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    54,
+                    59
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 13
+                    }
+                },
+                "value": "setup"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    60,
+                    64
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 14
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 18
+                    }
+                },
+                "value": "lang"
+            },
+            {
+                "type": "HTMLAssociation",
+                "range": [
+                    64,
+                    65
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 18
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 19
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLLiteral",
+                "range": [
+                    65,
+                    69
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 19
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 23
+                    }
+                },
+                "value": "ts"
+            },
+            {
+                "type": "HTMLIdentifier",
+                "range": [
+                    70,
+                    77
+                ],
+                "loc": {
+                    "start": {
+                        "column": 24,
+                        "line": 4
+                    },
+                    "end": {
+                        "column": 31,
+                        "line": 4
+                    }
+                },
+                "value": "generic"
+            },
+            {
+                "type": "HTMLAssociation",
+                "range": [
+                    77,
+                    78
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 31
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 32
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "Punctuator",
+                "range": [
+                    78,
+                    79
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 32
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 33
+                    }
+                },
+                "value": "\""
+            },
+            {
+                "type": "Identifier",
+                "value": "T",
+                "range": [
+                    79,
+                    80
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 33
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 34
+                    }
+                }
+            },
+            {
+                "type": "Keyword",
+                "value": "extends",
+                "range": [
+                    81,
+                    88
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 35
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 42
+                    }
+                }
+            },
+            {
+                "type": "Identifier",
+                "value": "Foo",
+                "range": [
+                    89,
+                    92
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 43
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 46
+                    }
+                }
+            },
+            {
+                "type": "Punctuator",
+                "value": ",",
+                "range": [
+                    92,
+                    93
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 46
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 47
+                    }
+                }
+            },
+            {
+                "type": "Identifier",
+                "value": "U",
+                "range": [
+                    94,
+                    95
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 48
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 49
+                    }
+                }
+            },
+            {
+                "type": "Keyword",
+                "value": "extends",
+                "range": [
+                    96,
+                    103
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 50
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 57
+                    }
+                }
+            },
+            {
+                "type": "Identifier",
+                "value": "T",
+                "range": [
+                    104,
+                    105
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 58
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 59
+                    }
+                }
+            },
+            {
+                "type": "Punctuator",
+                "range": [
+                    105,
+                    106
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 59
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 60
+                    }
+                },
+                "value": "\""
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    106,
+                    107
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 60
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 61
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    107,
+                    108
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 61
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    108,
+                    113
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 5
+                    }
+                },
+                "value": "const"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    113,
+                    114
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 6
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    114,
+                    115
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 6
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 7
+                    }
+                },
+                "value": "p"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    115,
+                    116
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 8
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    116,
+                    117
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 9
+                    }
+                },
+                "value": "="
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    117,
+                    118
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 10
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    118,
+                    137
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 29
+                    }
+                },
+                "value": "defineProps<{foo:T,"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    137,
+                    138
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 29
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 30
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    138,
+                    142
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 30
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 34
+                    }
+                },
+                "value": "bar:"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    142,
+                    143
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 34
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 35
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    143,
+                    148
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 35
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 40
+                    }
+                },
+                "value": "U}>()"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    148,
+                    149
+                ],
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 40
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    149,
+                    154
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 5
+                    }
+                },
+                "value": "const"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    154,
+                    155
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 6
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    155,
+                    158
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 6
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 9
+                    }
+                },
+                "value": "foo"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    158,
+                    159
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 10
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    159,
+                    160
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 11
+                    }
+                },
+                "value": "="
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    160,
+                    161
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 11
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 12
+                    }
+                },
+                "value": " "
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    161,
+                    166
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 12
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 17
+                    }
+                },
+                "value": "p.foo"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    166,
+                    167
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 17
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLRawText",
+                "range": [
+                    167,
+                    183
+                ],
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 16
+                    }
+                },
+                "value": "console.log(foo)"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    183,
+                    184
+                ],
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 16
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    184,
+                    192
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 8
+                    }
+                },
+                "value": "script"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    192,
+                    193
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 8
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 9
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    193,
+                    194
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLTagOpen",
+                "range": [
+                    194,
+                    203
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 9
+                    }
+                },
+                "value": "template"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    203,
+                    204
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 9
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 10
+                    }
+                },
+                "value": ""
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    204,
+                    205
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "VExpressionStart",
+                "range": [
+                    205,
+                    207
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 2
+                    }
+                },
+                "value": "{{"
+            },
+            {
+                "type": "Identifier",
+                "value": "foo",
+                "range": [
+                    207,
+                    210
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 2
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 5
+                    }
+                }
+            },
+            {
+                "type": "VExpressionEnd",
+                "range": [
+                    210,
+                    212
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 5
+                    },
+                    "end": {
+                        "line": 10,
+                        "column": 7
+                    }
+                },
+                "value": "}}"
+            },
+            {
+                "type": "HTMLWhitespace",
+                "range": [
+                    212,
+                    213
+                ],
+                "loc": {
+                    "start": {
+                        "line": 10,
+                        "column": 7
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 0
+                    }
+                },
+                "value": "\n"
+            },
+            {
+                "type": "HTMLEndTagOpen",
+                "range": [
+                    213,
+                    223
+                ],
+                "loc": {
+                    "start": {
+                        "line": 11,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 10
+                    }
+                },
+                "value": "template"
+            },
+            {
+                "type": "HTMLTagClose",
+                "range": [
+                    223,
+                    224
+                ],
+                "loc": {
+                    "start": {
+                        "line": 11,
+                        "column": 10
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 11
+                    }
+                },
+                "value": ""
+            }
+        ],
+        "comments": [],
+        "errors": []
+    }
+}
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-3/parser-options.json b/test/fixtures/ast/vue3.3-generic-3/parser-options.json
new file mode 100644
index 00000000..0ead30e9
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-3/parser-options.json
@@ -0,0 +1,6 @@
+{
+  "sourceType": "module",
+  "parser": {
+    "ts": "@typescript-eslint/parser"
+  }
+}
diff --git a/test/fixtures/ast/vue3.3-generic-3/scope.json b/test/fixtures/ast/vue3.3-generic-3/scope.json
new file mode 100644
index 00000000..7deedb76
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-3/scope.json
@@ -0,0 +1,1576 @@
+{
+    "type": "global",
+    "variables": [
+        {
+            "name": "ClassMemberDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassMethodDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassGetterDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassSetterDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorTarget",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassAccessorDecoratorResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassFieldDecoratorContext",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ClassDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "MethodDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ParameterDecorator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Symbol",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyKey",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDescriptor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PropertyDescriptorMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Object",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ObjectConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Function",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "FunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ThisParameterType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "OmitThisParameter",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "CallableFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NewableFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IArguments",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "String",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "StringConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Boolean",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "BooleanConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Number",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NumberConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TemplateStringsArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportMeta",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportCallOptions",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ImportAssertions",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Math",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Date",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DateConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpMatchArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpExecArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExp",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RegExpConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Error",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "EvalError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "EvalErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RangeError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "RangeErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReferenceError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReferenceErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SyntaxError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SyntaxErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypeError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypeErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "URIError",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "URIErrorConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "JSON",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlyArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ConcatArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "TypedPropertyDescriptor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseConstructorLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Promise",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Awaited",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Partial",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Required",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Readonly",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Pick",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Record",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Exclude",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Extract",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Omit",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "NonNullable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Parameters",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ConstructorParameters",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReturnType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "InstanceType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uppercase",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Lowercase",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Capitalize",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uncapitalize",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ThisType",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBuffer",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferTypes",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferLike",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ArrayBufferView",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DataView",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "DataViewConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int8Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int8ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ClampedArray",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint8ClampedArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int16Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int16ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint16Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint16ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Int32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Uint32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float32Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float32ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float64Array",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Float64ArrayConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Intl",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Map",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "MapConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlyMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakMap",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakMapConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Set",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SetConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ReadonlySet",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakSet",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "WeakSetConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SymbolConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorYieldResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorReturnResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IteratorResult",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Iterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Iterable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "IterableIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "PromiseConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Generator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "GeneratorFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "GeneratorFunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ProxyHandler",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "ProxyConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Reflect",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SharedArrayBuffer",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "SharedArrayBufferConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "Atomics",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterable",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncIterableIterator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGenerator",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGeneratorFunction",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "AsyncGeneratorFunctionConstructor",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "const",
+            "identifiers": [],
+            "defs": [],
+            "references": []
+        },
+        {
+            "name": "defineProps",
+            "identifiers": [],
+            "defs": [],
+            "references": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 21
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                }
+            ]
+        }
+    ],
+    "references": [],
+    "childScopes": [
+        {
+            "type": "module",
+            "variables": [
+                {
+                    "name": "Foo",
+                    "identifiers": [
+                        {
+                            "type": "Identifier",
+                            "name": "Foo",
+                            "loc": {
+                                "start": {
+                                    "line": 2,
+                                    "column": 5
+                                },
+                                "end": {
+                                    "line": 2,
+                                    "column": 8
+                                }
+                            }
+                        }
+                    ],
+                    "defs": [
+                        {
+                            "type": "Type",
+                            "node": {
+                                "type": "TSTypeAliasDeclaration",
+                                "loc": {
+                                    "start": {
+                                        "line": 2,
+                                        "column": 0
+                                    },
+                                    "end": {
+                                        "line": 2,
+                                        "column": 26
+                                    }
+                                }
+                            },
+                            "name": "Foo"
+                        }
+                    ],
+                    "references": [
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "Foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 2,
+                                        "column": 5
+                                    },
+                                    "end": {
+                                        "line": 2,
+                                        "column": 8
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "Foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 2,
+                                        "column": 5
+                                    },
+                                    "end": {
+                                        "line": 2,
+                                        "column": 8
+                                    }
+                                }
+                            },
+                            "init": null,
+                            "vueUsedInTemplate": true
+                        }
+                    ]
+                },
+                {
+                    "name": "p",
+                    "identifiers": [
+                        {
+                            "type": "Identifier",
+                            "name": "p",
+                            "loc": {
+                                "start": {
+                                    "line": 5,
+                                    "column": 6
+                                },
+                                "end": {
+                                    "line": 5,
+                                    "column": 7
+                                }
+                            }
+                        }
+                    ],
+                    "defs": [
+                        {
+                            "type": "Variable",
+                            "node": {
+                                "type": "VariableDeclarator",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 40
+                                    }
+                                }
+                            },
+                            "name": "p"
+                        }
+                    ],
+                    "references": [
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 7
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 7
+                                    }
+                                }
+                            },
+                            "init": true
+                        },
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 12
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 13
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "p",
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 7
+                                    }
+                                }
+                            },
+                            "init": null
+                        }
+                    ]
+                },
+                {
+                    "name": "foo",
+                    "identifiers": [
+                        {
+                            "type": "Identifier",
+                            "name": "foo",
+                            "loc": {
+                                "start": {
+                                    "line": 6,
+                                    "column": 6
+                                },
+                                "end": {
+                                    "line": 6,
+                                    "column": 9
+                                }
+                            }
+                        }
+                    ],
+                    "defs": [
+                        {
+                            "type": "Variable",
+                            "node": {
+                                "type": "VariableDeclarator",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 17
+                                    }
+                                }
+                            },
+                            "name": "foo"
+                        }
+                    ],
+                    "references": [
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "init": true
+                        },
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 7,
+                                        "column": 12
+                                    },
+                                    "end": {
+                                        "line": 7,
+                                        "column": 15
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "init": null
+                        },
+                        {
+                            "identifier": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "from": "module",
+                            "resolved": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "loc": {
+                                    "start": {
+                                        "line": 6,
+                                        "column": 6
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 9
+                                    }
+                                }
+                            },
+                            "init": null,
+                            "vueUsedInTemplate": true
+                        }
+                    ]
+                }
+            ],
+            "references": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "init": true
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 21
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 27
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 28
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "U",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 35
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 36
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "init": true
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 13
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "p",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "console",
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 12
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 15
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "loc": {
+                            "start": {
+                                "line": 6,
+                                "column": 6
+                            },
+                            "end": {
+                                "line": 6,
+                                "column": 9
+                            }
+                        }
+                    },
+                    "init": null
+                }
+            ],
+            "childScopes": [],
+            "through": [
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "defineProps",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 10
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 21
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 27
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 28
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "U",
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 35
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 36
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                },
+                {
+                    "identifier": {
+                        "type": "Identifier",
+                        "name": "console",
+                        "loc": {
+                            "start": {
+                                "line": 7,
+                                "column": 0
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 7
+                            }
+                        }
+                    },
+                    "from": "module",
+                    "resolved": null,
+                    "init": null
+                }
+            ]
+        }
+    ],
+    "through": [
+        {
+            "identifier": {
+                "type": "Identifier",
+                "name": "T",
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 27
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 28
+                    }
+                }
+            },
+            "from": "module",
+            "resolved": null,
+            "init": null
+        },
+        {
+            "identifier": {
+                "type": "Identifier",
+                "name": "U",
+                "loc": {
+                    "start": {
+                        "line": 5,
+                        "column": 35
+                    },
+                    "end": {
+                        "line": 5,
+                        "column": 36
+                    }
+                }
+            },
+            "from": "module",
+            "resolved": null,
+            "init": null
+        },
+        {
+            "identifier": {
+                "type": "Identifier",
+                "name": "console",
+                "loc": {
+                    "start": {
+                        "line": 7,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 7
+                    }
+                }
+            },
+            "from": "module",
+            "resolved": null,
+            "init": null
+        }
+    ]
+}
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-3/source.vue b/test/fixtures/ast/vue3.3-generic-3/source.vue
new file mode 100644
index 00000000..5d3590d2
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-3/source.vue
@@ -0,0 +1,11 @@
+<script>
+type Foo = number | string
+</script>
+<script setup lang="ts" generic="T extends Foo, U extends T">
+const p = defineProps<{foo:T, bar: U}>()
+const foo = p.foo
+console.log(foo)
+</script>
+<template>
+{{foo}}
+</template>
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-3/token-ranges.json b/test/fixtures/ast/vue3.3-generic-3/token-ranges.json
new file mode 100644
index 00000000..cec12a2a
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-3/token-ranges.json
@@ -0,0 +1,111 @@
+[
+    "<script>",
+    "type",
+    "Foo",
+    "=",
+    "number",
+    "|",
+    "string",
+    "</script>",
+    "<script setup lang=\"ts\" generic=\"T extends Foo, U extends T\">",
+    "const",
+    "p",
+    "=",
+    "defineProps",
+    "<",
+    "{",
+    "foo",
+    ":",
+    "T",
+    ",",
+    "bar",
+    ":",
+    "U",
+    "}",
+    ">",
+    "(",
+    ")",
+    "const",
+    "foo",
+    "=",
+    "p",
+    ".",
+    "foo",
+    "console",
+    ".",
+    "log",
+    "(",
+    "foo",
+    ")",
+    "</script>",
+    "<script",
+    ">",
+    "\n",
+    "type",
+    " ",
+    "Foo",
+    " ",
+    "=",
+    " ",
+    "number",
+    " ",
+    "|",
+    " ",
+    "string",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<script",
+    "setup",
+    "lang",
+    "=",
+    "\"ts\"",
+    "generic",
+    "=",
+    "\"",
+    "T",
+    "extends",
+    "Foo",
+    ",",
+    "U",
+    "extends",
+    "T",
+    "\"",
+    ">",
+    "\n",
+    "const",
+    " ",
+    "p",
+    " ",
+    "=",
+    " ",
+    "defineProps<{foo:T,",
+    " ",
+    "bar:",
+    " ",
+    "U}>()",
+    "\n",
+    "const",
+    " ",
+    "foo",
+    " ",
+    "=",
+    " ",
+    "p.foo",
+    "\n",
+    "console.log(foo)",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<template",
+    ">",
+    "\n",
+    "{{",
+    "foo",
+    "}}",
+    "\n",
+    "</template",
+    ">"
+]
\ No newline at end of file
diff --git a/test/fixtures/ast/vue3.3-generic-3/tree.json b/test/fixtures/ast/vue3.3-generic-3/tree.json
new file mode 100644
index 00000000..eea3840c
--- /dev/null
+++ b/test/fixtures/ast/vue3.3-generic-3/tree.json
@@ -0,0 +1,39 @@
+[
+    {
+        "type": "VElement",
+        "text": "<template>\n{{foo}}\n</template>",
+        "children": [
+            {
+                "type": "VStartTag",
+                "text": "<template>",
+                "children": []
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VExpressionContainer",
+                "text": "{{foo}}",
+                "children": [
+                    {
+                        "type": "Identifier",
+                        "text": "foo",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VEndTag",
+                "text": "</template>",
+                "children": []
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-1/document-fragment.json b/test/fixtures/document-fragment/vue3.3-generic-1/document-fragment.json
new file mode 100644
index 00000000..b354feda
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-1/document-fragment.json
@@ -0,0 +1,1463 @@
+{
+    "type": "VDocumentFragment",
+    "range": [
+        0,
+        100
+    ],
+    "loc": {
+        "start": {
+            "line": 1,
+            "column": 0
+        },
+        "end": {
+            "line": 6,
+            "column": 11
+        }
+    },
+    "children": [
+        {
+            "type": "VElement",
+            "range": [
+                0,
+                69
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "name": "script",
+            "rawName": "script",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    0,
+                    36
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 36
+                    }
+                },
+                "selfClosing": false,
+                "attributes": [
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            8,
+                            13
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 1,
+                                "column": 8
+                            },
+                            "end": {
+                                "line": 1,
+                                "column": 13
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                8,
+                                13
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 8
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 13
+                                }
+                            },
+                            "name": "setup",
+                            "rawName": "setup"
+                        },
+                        "value": null
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            14,
+                            23
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 1,
+                                "column": 14
+                            },
+                            "end": {
+                                "line": 1,
+                                "column": 23
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                14,
+                                18
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 14
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 18
+                                }
+                            },
+                            "name": "lang",
+                            "rawName": "lang"
+                        },
+                        "value": {
+                            "type": "VLiteral",
+                            "range": [
+                                19,
+                                23
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 19
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 23
+                                }
+                            },
+                            "value": "ts"
+                        }
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            24,
+                            35
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 1,
+                                "column": 24
+                            },
+                            "end": {
+                                "line": 1,
+                                "column": 35
+                            }
+                        },
+                        "directive": true,
+                        "key": {
+                            "type": "VDirectiveKey",
+                            "range": [
+                                24,
+                                31
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 24
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 31
+                                }
+                            },
+                            "name": {
+                                "type": "VIdentifier",
+                                "range": [
+                                    24,
+                                    31
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "column": 24,
+                                        "line": 1
+                                    },
+                                    "end": {
+                                        "column": 31,
+                                        "line": 1
+                                    }
+                                },
+                                "name": "generic",
+                                "rawName": "generic"
+                            },
+                            "argument": null,
+                            "modifiers": []
+                        },
+                        "value": {
+                            "type": "VExpressionContainer",
+                            "range": [
+                                32,
+                                35
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 32
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 35
+                                }
+                            },
+                            "expression": {
+                                "type": "VGenericExpression",
+                                "range": [
+                                    33,
+                                    34
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 1,
+                                        "column": 33
+                                    },
+                                    "end": {
+                                        "line": 1,
+                                        "column": 34
+                                    }
+                                },
+                                "params": [
+                                    {
+                                        "type": "TSTypeParameter",
+                                        "name": {
+                                            "type": "Identifier",
+                                            "name": "T",
+                                            "range": [
+                                                33,
+                                                34
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 1,
+                                                    "column": 33
+                                                },
+                                                "end": {
+                                                    "line": 1,
+                                                    "column": 34
+                                                }
+                                            }
+                                        },
+                                        "in": false,
+                                        "out": false,
+                                        "const": false,
+                                        "range": [
+                                            33,
+                                            34
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 1,
+                                                "column": 33
+                                            },
+                                            "end": {
+                                                "line": 1,
+                                                "column": 34
+                                            }
+                                        }
+                                    }
+                                ],
+                                "rawParams": [
+                                    "T"
+                                ]
+                            },
+                            "references": []
+                        }
+                    }
+                ]
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        36,
+                        60
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 36
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 0
+                        }
+                    },
+                    "value": "\ndefineProps<{foo:T}>()\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    60,
+                    69
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 9
+                    }
+                }
+            },
+            "variables": [
+                {
+                    "id": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "range": [
+                            33,
+                            34
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 1,
+                                "column": 33
+                            },
+                            "end": {
+                                "line": 1,
+                                "column": 34
+                            }
+                        }
+                    },
+                    "kind": "generic"
+                }
+            ]
+        },
+        {
+            "type": "VText",
+            "range": [
+                69,
+                70
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 9
+                },
+                "end": {
+                    "line": 4,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VElement",
+            "range": [
+                70,
+                100
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 11
+                }
+            },
+            "name": "template",
+            "rawName": "template",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    70,
+                    80
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 10
+                    }
+                },
+                "selfClosing": false,
+                "attributes": []
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        80,
+                        81
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionContainer",
+                    "range": [
+                        81,
+                        88
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 7
+                        }
+                    },
+                    "expression": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            83,
+                            86
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 2
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 5
+                            }
+                        }
+                    },
+                    "references": [
+                        {
+                            "id": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "range": [
+                                    83,
+                                    86
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 5,
+                                        "column": 2
+                                    },
+                                    "end": {
+                                        "line": 5,
+                                        "column": 5
+                                    }
+                                }
+                            },
+                            "mode": "r",
+                            "isValueReference": true,
+                            "isTypeReference": false
+                        }
+                    ]
+                },
+                {
+                    "type": "VText",
+                    "range": [
+                        88,
+                        89
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    89,
+                    100
+                ],
+                "loc": {
+                    "start": {
+                        "line": 6,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 6,
+                        "column": 11
+                    }
+                }
+            },
+            "variables": [],
+            "tokens": [
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        0,
+                        7
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 7
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        8,
+                        13
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 13
+                        }
+                    },
+                    "value": "setup"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        14,
+                        18
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 14
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 18
+                        }
+                    },
+                    "value": "lang"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        18,
+                        19
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 18
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 19
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLLiteral",
+                    "range": [
+                        19,
+                        23
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 19
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 23
+                        }
+                    },
+                    "value": "ts"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        24,
+                        31
+                    ],
+                    "loc": {
+                        "start": {
+                            "column": 24,
+                            "line": 1
+                        },
+                        "end": {
+                            "column": 31,
+                            "line": 1
+                        }
+                    },
+                    "value": "generic"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        31,
+                        32
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 31
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 32
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        32,
+                        33
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 32
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 33
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "Identifier",
+                    "value": "T",
+                    "range": [
+                        33,
+                        34
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 33
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 34
+                        }
+                    }
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        34,
+                        35
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 34
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 35
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        35,
+                        36
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 35
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 36
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        36,
+                        37
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 36
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        37,
+                        59
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 22
+                        }
+                    },
+                    "value": "defineProps<{foo:T}>()"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        59,
+                        60
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 22
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        60,
+                        68
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 8
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        68,
+                        69
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 9
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        69,
+                        70
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        70,
+                        79
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 9
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        79,
+                        80
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 10
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        80,
+                        81
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionStart",
+                    "range": [
+                        81,
+                        83
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 2
+                        }
+                    },
+                    "value": "{{"
+                },
+                {
+                    "type": "Identifier",
+                    "value": "foo",
+                    "range": [
+                        83,
+                        86
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 5
+                        }
+                    }
+                },
+                {
+                    "type": "VExpressionEnd",
+                    "range": [
+                        86,
+                        88
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 7
+                        }
+                    },
+                    "value": "}}"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        88,
+                        89
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        89,
+                        99
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 10
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        99,
+                        100
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 11
+                        }
+                    },
+                    "value": ""
+                }
+            ],
+            "comments": [],
+            "errors": []
+        }
+    ],
+    "tokens": [
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                0,
+                7
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 1,
+                    "column": 7
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                8,
+                13
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 8
+                },
+                "end": {
+                    "line": 1,
+                    "column": 13
+                }
+            },
+            "value": "setup"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                14,
+                18
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 14
+                },
+                "end": {
+                    "line": 1,
+                    "column": 18
+                }
+            },
+            "value": "lang"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                18,
+                19
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 18
+                },
+                "end": {
+                    "line": 1,
+                    "column": 19
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLLiteral",
+            "range": [
+                19,
+                23
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 19
+                },
+                "end": {
+                    "line": 1,
+                    "column": 23
+                }
+            },
+            "value": "ts"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                24,
+                31
+            ],
+            "loc": {
+                "start": {
+                    "column": 24,
+                    "line": 1
+                },
+                "end": {
+                    "column": 31,
+                    "line": 1
+                }
+            },
+            "value": "generic"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                31,
+                32
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 31
+                },
+                "end": {
+                    "line": 1,
+                    "column": 32
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                32,
+                33
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 32
+                },
+                "end": {
+                    "line": 1,
+                    "column": 33
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                33,
+                34
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 33
+                },
+                "end": {
+                    "line": 1,
+                    "column": 34
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                34,
+                35
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 34
+                },
+                "end": {
+                    "line": 1,
+                    "column": 35
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                35,
+                36
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 35
+                },
+                "end": {
+                    "line": 1,
+                    "column": 36
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                36,
+                37
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 36
+                },
+                "end": {
+                    "line": 2,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                37,
+                59
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 22
+                }
+            },
+            "value": "defineProps<{foo:T}>()"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                59,
+                60
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 22
+                },
+                "end": {
+                    "line": 3,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                60,
+                68
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 8
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                68,
+                69
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 8
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                69,
+                70
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 9
+                },
+                "end": {
+                    "line": 4,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                70,
+                79
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 4,
+                    "column": 9
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                79,
+                80
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 9
+                },
+                "end": {
+                    "line": 4,
+                    "column": 10
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                80,
+                81
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 10
+                },
+                "end": {
+                    "line": 5,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VExpressionStart",
+            "range": [
+                81,
+                83
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 0
+                },
+                "end": {
+                    "line": 5,
+                    "column": 2
+                }
+            },
+            "value": "{{"
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                83,
+                86
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 2
+                },
+                "end": {
+                    "line": 5,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "VExpressionEnd",
+            "range": [
+                86,
+                88
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 5
+                },
+                "end": {
+                    "line": 5,
+                    "column": 7
+                }
+            },
+            "value": "}}"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                88,
+                89
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 7
+                },
+                "end": {
+                    "line": 6,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                89,
+                99
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 10
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                99,
+                100
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 10
+                },
+                "end": {
+                    "line": 6,
+                    "column": 11
+                }
+            },
+            "value": ""
+        }
+    ],
+    "comments": [],
+    "errors": []
+}
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-1/parser-options.json b/test/fixtures/document-fragment/vue3.3-generic-1/parser-options.json
new file mode 100644
index 00000000..0ead30e9
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-1/parser-options.json
@@ -0,0 +1,6 @@
+{
+  "sourceType": "module",
+  "parser": {
+    "ts": "@typescript-eslint/parser"
+  }
+}
diff --git a/test/fixtures/document-fragment/vue3.3-generic-1/source.vue b/test/fixtures/document-fragment/vue3.3-generic-1/source.vue
new file mode 100644
index 00000000..fc54be37
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-1/source.vue
@@ -0,0 +1,6 @@
+<script setup lang="ts" generic="T">
+defineProps<{foo:T}>()
+</script>
+<template>
+{{foo}}
+</template>
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-1/token-ranges.json b/test/fixtures/document-fragment/vue3.3-generic-1/token-ranges.json
new file mode 100644
index 00000000..80b1a7d7
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-1/token-ranges.json
@@ -0,0 +1,28 @@
+[
+    "<script",
+    "setup",
+    "lang",
+    "=",
+    "\"ts\"",
+    "generic",
+    "=",
+    "\"",
+    "T",
+    "\"",
+    ">",
+    "\n",
+    "defineProps<{foo:T}>()",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<template",
+    ">",
+    "\n",
+    "{{",
+    "foo",
+    "}}",
+    "\n",
+    "</template",
+    ">"
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-1/tree.json b/test/fixtures/document-fragment/vue3.3-generic-1/tree.json
new file mode 100644
index 00000000..0c0a767a
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-1/tree.json
@@ -0,0 +1,139 @@
+[
+    {
+        "type": "VDocumentFragment",
+        "text": "<script setup lang=\"ts\" generic=\"T\">\ndefineProps<{foo:T}>()\n</script>\n<template>\n{{foo}}\n</template>",
+        "children": [
+            {
+                "type": "VElement",
+                "text": "<script setup lang=\"ts\" generic=\"T\">\ndefineProps<{foo:T}>()\n</script>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<script setup lang=\"ts\" generic=\"T\">",
+                        "children": [
+                            {
+                                "type": "VAttribute",
+                                "text": "setup",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "setup",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "lang=\"ts\"",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "lang",
+                                        "children": []
+                                    },
+                                    {
+                                        "type": "VLiteral",
+                                        "text": "\"ts\"",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "generic=\"T\"",
+                                "children": [
+                                    {
+                                        "type": "VDirectiveKey",
+                                        "text": "generic",
+                                        "children": [
+                                            {
+                                                "type": "VIdentifier",
+                                                "text": "generic",
+                                                "children": []
+                                            }
+                                        ]
+                                    },
+                                    {
+                                        "type": "VExpressionContainer",
+                                        "text": "\"T\"",
+                                        "children": [
+                                            {
+                                                "type": "VGenericExpression",
+                                                "text": "T",
+                                                "children": [
+                                                    {
+                                                        "type": "TSTypeParameter",
+                                                        "text": "T",
+                                                        "children": [
+                                                            {
+                                                                "type": "Identifier",
+                                                                "text": "T",
+                                                                "children": []
+                                                            }
+                                                        ]
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\ndefineProps<{foo:T}>()\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</script>",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VElement",
+                "text": "<template>\n{{foo}}\n</template>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<template>",
+                        "children": []
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VExpressionContainer",
+                        "text": "{{foo}}",
+                        "children": [
+                            {
+                                "type": "Identifier",
+                                "text": "foo",
+                                "children": []
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</template>",
+                        "children": []
+                    }
+                ]
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-2/document-fragment.json b/test/fixtures/document-fragment/vue3.3-generic-2/document-fragment.json
new file mode 100644
index 00000000..efd5dc1c
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-2/document-fragment.json
@@ -0,0 +1,2913 @@
+{
+    "type": "VDocumentFragment",
+    "range": [
+        0,
+        203
+    ],
+    "loc": {
+        "start": {
+            "line": 1,
+            "column": 0
+        },
+        "end": {
+            "line": 11,
+            "column": 11
+        }
+    },
+    "children": [
+        {
+            "type": "VElement",
+            "range": [
+                0,
+                45
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "name": "script",
+            "rawName": "script",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    0,
+                    8
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 8
+                    }
+                },
+                "selfClosing": false,
+                "attributes": []
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        8,
+                        36
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 0
+                        }
+                    },
+                    "value": "\ntype Foo = number | string\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    36,
+                    45
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 9
+                    }
+                }
+            },
+            "variables": []
+        },
+        {
+            "type": "VText",
+            "range": [
+                45,
+                46
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 9
+                },
+                "end": {
+                    "line": 4,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VElement",
+            "range": [
+                46,
+                172
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 8,
+                    "column": 9
+                }
+            },
+            "name": "script",
+            "rawName": "script",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    46,
+                    94
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 48
+                    }
+                },
+                "selfClosing": false,
+                "attributes": [
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            54,
+                            59
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 8
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 13
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                54,
+                                59
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 8
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 13
+                                }
+                            },
+                            "name": "setup",
+                            "rawName": "setup"
+                        },
+                        "value": null
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            60,
+                            69
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 14
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 23
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                60,
+                                64
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 14
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 18
+                                }
+                            },
+                            "name": "lang",
+                            "rawName": "lang"
+                        },
+                        "value": {
+                            "type": "VLiteral",
+                            "range": [
+                                65,
+                                69
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 19
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 23
+                                }
+                            },
+                            "value": "ts"
+                        }
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            70,
+                            93
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 24
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 47
+                            }
+                        },
+                        "directive": true,
+                        "key": {
+                            "type": "VDirectiveKey",
+                            "range": [
+                                70,
+                                77
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 24
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 31
+                                }
+                            },
+                            "name": {
+                                "type": "VIdentifier",
+                                "range": [
+                                    70,
+                                    77
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "column": 24,
+                                        "line": 4
+                                    },
+                                    "end": {
+                                        "column": 31,
+                                        "line": 4
+                                    }
+                                },
+                                "name": "generic",
+                                "rawName": "generic"
+                            },
+                            "argument": null,
+                            "modifiers": []
+                        },
+                        "value": {
+                            "type": "VExpressionContainer",
+                            "range": [
+                                78,
+                                93
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 32
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 47
+                                }
+                            },
+                            "expression": {
+                                "type": "VGenericExpression",
+                                "range": [
+                                    79,
+                                    92
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 4,
+                                        "column": 33
+                                    },
+                                    "end": {
+                                        "line": 4,
+                                        "column": 46
+                                    }
+                                },
+                                "params": [
+                                    {
+                                        "type": "TSTypeParameter",
+                                        "name": {
+                                            "type": "Identifier",
+                                            "name": "T",
+                                            "range": [
+                                                79,
+                                                80
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 4,
+                                                    "column": 33
+                                                },
+                                                "end": {
+                                                    "line": 4,
+                                                    "column": 34
+                                                }
+                                            }
+                                        },
+                                        "constraint": {
+                                            "type": "TSTypeReference",
+                                            "typeName": {
+                                                "type": "Identifier",
+                                                "name": "Foo",
+                                                "range": [
+                                                    89,
+                                                    92
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 4,
+                                                        "column": 43
+                                                    },
+                                                    "end": {
+                                                        "line": 4,
+                                                        "column": 46
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                89,
+                                                92
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 4,
+                                                    "column": 43
+                                                },
+                                                "end": {
+                                                    "line": 4,
+                                                    "column": 46
+                                                }
+                                            }
+                                        },
+                                        "in": false,
+                                        "out": false,
+                                        "const": false,
+                                        "range": [
+                                            79,
+                                            92
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 4,
+                                                "column": 33
+                                            },
+                                            "end": {
+                                                "line": 4,
+                                                "column": 46
+                                            }
+                                        }
+                                    }
+                                ],
+                                "rawParams": [
+                                    "T extends Foo"
+                                ]
+                            },
+                            "references": [
+                                {
+                                    "id": {
+                                        "type": "Identifier",
+                                        "name": "Foo",
+                                        "range": [
+                                            89,
+                                            92
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 4,
+                                                "column": 43
+                                            },
+                                            "end": {
+                                                "line": 4,
+                                                "column": 46
+                                            }
+                                        }
+                                    },
+                                    "mode": "r",
+                                    "isValueReference": false,
+                                    "isTypeReference": true
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        94,
+                        163
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 48
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 0
+                        }
+                    },
+                    "value": "\nconst p = defineProps<{foo:T}>()\nconst foo = p.foo\nconsole.log(foo)\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    163,
+                    172
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 9
+                    }
+                }
+            },
+            "variables": [
+                {
+                    "id": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "range": [
+                            79,
+                            80
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 33
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 34
+                            }
+                        }
+                    },
+                    "kind": "generic"
+                }
+            ]
+        },
+        {
+            "type": "VText",
+            "range": [
+                172,
+                173
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 9
+                },
+                "end": {
+                    "line": 9,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VElement",
+            "range": [
+                173,
+                203
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 0
+                },
+                "end": {
+                    "line": 11,
+                    "column": 11
+                }
+            },
+            "name": "template",
+            "rawName": "template",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    173,
+                    183
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 10
+                    }
+                },
+                "selfClosing": false,
+                "attributes": []
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        183,
+                        184
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionContainer",
+                    "range": [
+                        184,
+                        191
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 7
+                        }
+                    },
+                    "expression": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            186,
+                            189
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 10,
+                                "column": 2
+                            },
+                            "end": {
+                                "line": 10,
+                                "column": 5
+                            }
+                        }
+                    },
+                    "references": [
+                        {
+                            "id": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "range": [
+                                    186,
+                                    189
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 10,
+                                        "column": 2
+                                    },
+                                    "end": {
+                                        "line": 10,
+                                        "column": 5
+                                    }
+                                }
+                            },
+                            "mode": "r",
+                            "isValueReference": true,
+                            "isTypeReference": false
+                        }
+                    ]
+                },
+                {
+                    "type": "VText",
+                    "range": [
+                        191,
+                        192
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    192,
+                    203
+                ],
+                "loc": {
+                    "start": {
+                        "line": 11,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 11
+                    }
+                }
+            },
+            "variables": [],
+            "tokens": [
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        0,
+                        7
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 7
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        7,
+                        8
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 8
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        8,
+                        9
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        9,
+                        13
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 4
+                        }
+                    },
+                    "value": "type"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        13,
+                        14
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 4
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 5
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        14,
+                        17
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 8
+                        }
+                    },
+                    "value": "Foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        17,
+                        18
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 9
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        18,
+                        19
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 10
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        19,
+                        20
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 11
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        20,
+                        26
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 11
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 17
+                        }
+                    },
+                    "value": "number"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        26,
+                        27
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 17
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 18
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        27,
+                        28
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 18
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 19
+                        }
+                    },
+                    "value": "|"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        28,
+                        29
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 19
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 20
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        29,
+                        35
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 20
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 26
+                        }
+                    },
+                    "value": "string"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        35,
+                        36
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 26
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        36,
+                        44
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 8
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        44,
+                        45
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 9
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        45,
+                        46
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        46,
+                        53
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 7
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        54,
+                        59
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 13
+                        }
+                    },
+                    "value": "setup"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        60,
+                        64
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 14
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 18
+                        }
+                    },
+                    "value": "lang"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        64,
+                        65
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 18
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 19
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLLiteral",
+                    "range": [
+                        65,
+                        69
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 19
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 23
+                        }
+                    },
+                    "value": "ts"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        70,
+                        77
+                    ],
+                    "loc": {
+                        "start": {
+                            "column": 24,
+                            "line": 4
+                        },
+                        "end": {
+                            "column": 31,
+                            "line": 4
+                        }
+                    },
+                    "value": "generic"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        77,
+                        78
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 31
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 32
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        78,
+                        79
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 32
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 33
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "Identifier",
+                    "value": "T",
+                    "range": [
+                        79,
+                        80
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 33
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 34
+                        }
+                    }
+                },
+                {
+                    "type": "Keyword",
+                    "value": "extends",
+                    "range": [
+                        81,
+                        88
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 35
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 42
+                        }
+                    }
+                },
+                {
+                    "type": "Identifier",
+                    "value": "Foo",
+                    "range": [
+                        89,
+                        92
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 43
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 46
+                        }
+                    }
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        92,
+                        93
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 46
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 47
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        93,
+                        94
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 47
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 48
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        94,
+                        95
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 48
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        95,
+                        100
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 5
+                        }
+                    },
+                    "value": "const"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        100,
+                        101
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 6
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        101,
+                        102
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 7
+                        }
+                    },
+                    "value": "p"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        102,
+                        103
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 8
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        103,
+                        104
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 9
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        104,
+                        105
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 10
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        105,
+                        127
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 32
+                        }
+                    },
+                    "value": "defineProps<{foo:T}>()"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        127,
+                        128
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 32
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        128,
+                        133
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 5
+                        }
+                    },
+                    "value": "const"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        133,
+                        134
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 6
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        134,
+                        137
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 9
+                        }
+                    },
+                    "value": "foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        137,
+                        138
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 10
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        138,
+                        139
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 11
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        139,
+                        140
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 11
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 12
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        140,
+                        145
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 12
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 17
+                        }
+                    },
+                    "value": "p.foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        145,
+                        146
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 17
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        146,
+                        162
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 16
+                        }
+                    },
+                    "value": "console.log(foo)"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        162,
+                        163
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 16
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        163,
+                        171
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 8
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        171,
+                        172
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 9
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        172,
+                        173
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        173,
+                        182
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 9
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        182,
+                        183
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 10
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        183,
+                        184
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionStart",
+                    "range": [
+                        184,
+                        186
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 2
+                        }
+                    },
+                    "value": "{{"
+                },
+                {
+                    "type": "Identifier",
+                    "value": "foo",
+                    "range": [
+                        186,
+                        189
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 5
+                        }
+                    }
+                },
+                {
+                    "type": "VExpressionEnd",
+                    "range": [
+                        189,
+                        191
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 7
+                        }
+                    },
+                    "value": "}}"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        191,
+                        192
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        192,
+                        202
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 11,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 10
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        202,
+                        203
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 11,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 11
+                        }
+                    },
+                    "value": ""
+                }
+            ],
+            "comments": [],
+            "errors": []
+        }
+    ],
+    "tokens": [
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                0,
+                7
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 1,
+                    "column": 7
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                7,
+                8
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 7
+                },
+                "end": {
+                    "line": 1,
+                    "column": 8
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                8,
+                9
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 8
+                },
+                "end": {
+                    "line": 2,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                9,
+                13
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 4
+                }
+            },
+            "value": "type"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                13,
+                14
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 4
+                },
+                "end": {
+                    "line": 2,
+                    "column": 5
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                14,
+                17
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 5
+                },
+                "end": {
+                    "line": 2,
+                    "column": 8
+                }
+            },
+            "value": "Foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                17,
+                18
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 8
+                },
+                "end": {
+                    "line": 2,
+                    "column": 9
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                18,
+                19
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 9
+                },
+                "end": {
+                    "line": 2,
+                    "column": 10
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                19,
+                20
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 10
+                },
+                "end": {
+                    "line": 2,
+                    "column": 11
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                20,
+                26
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 11
+                },
+                "end": {
+                    "line": 2,
+                    "column": 17
+                }
+            },
+            "value": "number"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                26,
+                27
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 17
+                },
+                "end": {
+                    "line": 2,
+                    "column": 18
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                27,
+                28
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 18
+                },
+                "end": {
+                    "line": 2,
+                    "column": 19
+                }
+            },
+            "value": "|"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                28,
+                29
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 19
+                },
+                "end": {
+                    "line": 2,
+                    "column": 20
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                29,
+                35
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 20
+                },
+                "end": {
+                    "line": 2,
+                    "column": 26
+                }
+            },
+            "value": "string"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                35,
+                36
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 26
+                },
+                "end": {
+                    "line": 3,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                36,
+                44
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 8
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                44,
+                45
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 8
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                45,
+                46
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 9
+                },
+                "end": {
+                    "line": 4,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                46,
+                53
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 4,
+                    "column": 7
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                54,
+                59
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 8
+                },
+                "end": {
+                    "line": 4,
+                    "column": 13
+                }
+            },
+            "value": "setup"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                60,
+                64
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 14
+                },
+                "end": {
+                    "line": 4,
+                    "column": 18
+                }
+            },
+            "value": "lang"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                64,
+                65
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 18
+                },
+                "end": {
+                    "line": 4,
+                    "column": 19
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLLiteral",
+            "range": [
+                65,
+                69
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 19
+                },
+                "end": {
+                    "line": 4,
+                    "column": 23
+                }
+            },
+            "value": "ts"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                70,
+                77
+            ],
+            "loc": {
+                "start": {
+                    "column": 24,
+                    "line": 4
+                },
+                "end": {
+                    "column": 31,
+                    "line": 4
+                }
+            },
+            "value": "generic"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                77,
+                78
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 31
+                },
+                "end": {
+                    "line": 4,
+                    "column": 32
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                78,
+                79
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 32
+                },
+                "end": {
+                    "line": 4,
+                    "column": 33
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                79,
+                80
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 33
+                },
+                "end": {
+                    "line": 4,
+                    "column": 34
+                }
+            }
+        },
+        {
+            "type": "Keyword",
+            "value": "extends",
+            "range": [
+                81,
+                88
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 35
+                },
+                "end": {
+                    "line": 4,
+                    "column": 42
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "Foo",
+            "range": [
+                89,
+                92
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 43
+                },
+                "end": {
+                    "line": 4,
+                    "column": 46
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                92,
+                93
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 46
+                },
+                "end": {
+                    "line": 4,
+                    "column": 47
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                93,
+                94
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 47
+                },
+                "end": {
+                    "line": 4,
+                    "column": 48
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                94,
+                95
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 48
+                },
+                "end": {
+                    "line": 5,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                95,
+                100
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 0
+                },
+                "end": {
+                    "line": 5,
+                    "column": 5
+                }
+            },
+            "value": "const"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                100,
+                101
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 5
+                },
+                "end": {
+                    "line": 5,
+                    "column": 6
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                101,
+                102
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 6
+                },
+                "end": {
+                    "line": 5,
+                    "column": 7
+                }
+            },
+            "value": "p"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                102,
+                103
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 7
+                },
+                "end": {
+                    "line": 5,
+                    "column": 8
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                103,
+                104
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 8
+                },
+                "end": {
+                    "line": 5,
+                    "column": 9
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                104,
+                105
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 9
+                },
+                "end": {
+                    "line": 5,
+                    "column": 10
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                105,
+                127
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 10
+                },
+                "end": {
+                    "line": 5,
+                    "column": 32
+                }
+            },
+            "value": "defineProps<{foo:T}>()"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                127,
+                128
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 32
+                },
+                "end": {
+                    "line": 6,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                128,
+                133
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 5
+                }
+            },
+            "value": "const"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                133,
+                134
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 5
+                },
+                "end": {
+                    "line": 6,
+                    "column": 6
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                134,
+                137
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 6
+                },
+                "end": {
+                    "line": 6,
+                    "column": 9
+                }
+            },
+            "value": "foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                137,
+                138
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 9
+                },
+                "end": {
+                    "line": 6,
+                    "column": 10
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                138,
+                139
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 10
+                },
+                "end": {
+                    "line": 6,
+                    "column": 11
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                139,
+                140
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 11
+                },
+                "end": {
+                    "line": 6,
+                    "column": 12
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                140,
+                145
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 12
+                },
+                "end": {
+                    "line": 6,
+                    "column": 17
+                }
+            },
+            "value": "p.foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                145,
+                146
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 17
+                },
+                "end": {
+                    "line": 7,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                146,
+                162
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 0
+                },
+                "end": {
+                    "line": 7,
+                    "column": 16
+                }
+            },
+            "value": "console.log(foo)"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                162,
+                163
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 16
+                },
+                "end": {
+                    "line": 8,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                163,
+                171
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 0
+                },
+                "end": {
+                    "line": 8,
+                    "column": 8
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                171,
+                172
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 8
+                },
+                "end": {
+                    "line": 8,
+                    "column": 9
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                172,
+                173
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 9
+                },
+                "end": {
+                    "line": 9,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                173,
+                182
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 0
+                },
+                "end": {
+                    "line": 9,
+                    "column": 9
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                182,
+                183
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 9
+                },
+                "end": {
+                    "line": 9,
+                    "column": 10
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                183,
+                184
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 10
+                },
+                "end": {
+                    "line": 10,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VExpressionStart",
+            "range": [
+                184,
+                186
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 0
+                },
+                "end": {
+                    "line": 10,
+                    "column": 2
+                }
+            },
+            "value": "{{"
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                186,
+                189
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 2
+                },
+                "end": {
+                    "line": 10,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "VExpressionEnd",
+            "range": [
+                189,
+                191
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 5
+                },
+                "end": {
+                    "line": 10,
+                    "column": 7
+                }
+            },
+            "value": "}}"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                191,
+                192
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 7
+                },
+                "end": {
+                    "line": 11,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                192,
+                202
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 0
+                },
+                "end": {
+                    "line": 11,
+                    "column": 10
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                202,
+                203
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 10
+                },
+                "end": {
+                    "line": 11,
+                    "column": 11
+                }
+            },
+            "value": ""
+        }
+    ],
+    "comments": [],
+    "errors": []
+}
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-2/parser-options.json b/test/fixtures/document-fragment/vue3.3-generic-2/parser-options.json
new file mode 100644
index 00000000..0ead30e9
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-2/parser-options.json
@@ -0,0 +1,6 @@
+{
+  "sourceType": "module",
+  "parser": {
+    "ts": "@typescript-eslint/parser"
+  }
+}
diff --git a/test/fixtures/document-fragment/vue3.3-generic-2/source.vue b/test/fixtures/document-fragment/vue3.3-generic-2/source.vue
new file mode 100644
index 00000000..e42bea85
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-2/source.vue
@@ -0,0 +1,11 @@
+<script>
+type Foo = number | string
+</script>
+<script setup lang="ts" generic="T extends Foo">
+const p = defineProps<{foo:T}>()
+const foo = p.foo
+console.log(foo)
+</script>
+<template>
+{{foo}}
+</template>
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-2/token-ranges.json b/test/fixtures/document-fragment/vue3.3-generic-2/token-ranges.json
new file mode 100644
index 00000000..0f21efc8
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-2/token-ranges.json
@@ -0,0 +1,64 @@
+[
+    "<script",
+    ">",
+    "\n",
+    "type",
+    " ",
+    "Foo",
+    " ",
+    "=",
+    " ",
+    "number",
+    " ",
+    "|",
+    " ",
+    "string",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<script",
+    "setup",
+    "lang",
+    "=",
+    "\"ts\"",
+    "generic",
+    "=",
+    "\"",
+    "T",
+    "extends",
+    "Foo",
+    "\"",
+    ">",
+    "\n",
+    "const",
+    " ",
+    "p",
+    " ",
+    "=",
+    " ",
+    "defineProps<{foo:T}>()",
+    "\n",
+    "const",
+    " ",
+    "foo",
+    " ",
+    "=",
+    " ",
+    "p.foo",
+    "\n",
+    "console.log(foo)",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<template",
+    ">",
+    "\n",
+    "{{",
+    "foo",
+    "}}",
+    "\n",
+    "</template",
+    ">"
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-2/tree.json b/test/fixtures/document-fragment/vue3.3-generic-2/tree.json
new file mode 100644
index 00000000..c55894cd
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-2/tree.json
@@ -0,0 +1,176 @@
+[
+    {
+        "type": "VDocumentFragment",
+        "text": "<script>\ntype Foo = number | string\n</script>\n<script setup lang=\"ts\" generic=\"T extends Foo\">\nconst p = defineProps<{foo:T}>()\nconst foo = p.foo\nconsole.log(foo)\n</script>\n<template>\n{{foo}}\n</template>",
+        "children": [
+            {
+                "type": "VElement",
+                "text": "<script>\ntype Foo = number | string\n</script>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<script>",
+                        "children": []
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\ntype Foo = number | string\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</script>",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VElement",
+                "text": "<script setup lang=\"ts\" generic=\"T extends Foo\">\nconst p = defineProps<{foo:T}>()\nconst foo = p.foo\nconsole.log(foo)\n</script>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<script setup lang=\"ts\" generic=\"T extends Foo\">",
+                        "children": [
+                            {
+                                "type": "VAttribute",
+                                "text": "setup",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "setup",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "lang=\"ts\"",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "lang",
+                                        "children": []
+                                    },
+                                    {
+                                        "type": "VLiteral",
+                                        "text": "\"ts\"",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "generic=\"T extends Foo\"",
+                                "children": [
+                                    {
+                                        "type": "VDirectiveKey",
+                                        "text": "generic",
+                                        "children": [
+                                            {
+                                                "type": "VIdentifier",
+                                                "text": "generic",
+                                                "children": []
+                                            }
+                                        ]
+                                    },
+                                    {
+                                        "type": "VExpressionContainer",
+                                        "text": "\"T extends Foo\"",
+                                        "children": [
+                                            {
+                                                "type": "VGenericExpression",
+                                                "text": "T extends Foo",
+                                                "children": [
+                                                    {
+                                                        "type": "TSTypeParameter",
+                                                        "text": "T extends Foo",
+                                                        "children": [
+                                                            {
+                                                                "type": "Identifier",
+                                                                "text": "T",
+                                                                "children": []
+                                                            },
+                                                            {
+                                                                "type": "TSTypeReference",
+                                                                "text": "Foo",
+                                                                "children": [
+                                                                    {
+                                                                        "type": "Identifier",
+                                                                        "text": "Foo",
+                                                                        "children": []
+                                                                    }
+                                                                ]
+                                                            }
+                                                        ]
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\nconst p = defineProps<{foo:T}>()\nconst foo = p.foo\nconsole.log(foo)\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</script>",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VElement",
+                "text": "<template>\n{{foo}}\n</template>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<template>",
+                        "children": []
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VExpressionContainer",
+                        "text": "{{foo}}",
+                        "children": [
+                            {
+                                "type": "Identifier",
+                                "text": "foo",
+                                "children": []
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</template>",
+                        "children": []
+                    }
+                ]
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-3/document-fragment.json b/test/fixtures/document-fragment/vue3.3-generic-3/document-fragment.json
new file mode 100644
index 00000000..f3bedad1
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-3/document-fragment.json
@@ -0,0 +1,3296 @@
+{
+    "type": "VDocumentFragment",
+    "range": [
+        0,
+        224
+    ],
+    "loc": {
+        "start": {
+            "line": 1,
+            "column": 0
+        },
+        "end": {
+            "line": 11,
+            "column": 11
+        }
+    },
+    "children": [
+        {
+            "type": "VElement",
+            "range": [
+                0,
+                45
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "name": "script",
+            "rawName": "script",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    0,
+                    8
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 1,
+                        "column": 8
+                    }
+                },
+                "selfClosing": false,
+                "attributes": []
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        8,
+                        36
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 0
+                        }
+                    },
+                    "value": "\ntype Foo = number | string\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    36,
+                    45
+                ],
+                "loc": {
+                    "start": {
+                        "line": 3,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 3,
+                        "column": 9
+                    }
+                }
+            },
+            "variables": []
+        },
+        {
+            "type": "VText",
+            "range": [
+                45,
+                46
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 9
+                },
+                "end": {
+                    "line": 4,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VElement",
+            "range": [
+                46,
+                193
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 8,
+                    "column": 9
+                }
+            },
+            "name": "script",
+            "rawName": "script",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    46,
+                    107
+                ],
+                "loc": {
+                    "start": {
+                        "line": 4,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 4,
+                        "column": 61
+                    }
+                },
+                "selfClosing": false,
+                "attributes": [
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            54,
+                            59
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 8
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 13
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                54,
+                                59
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 8
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 13
+                                }
+                            },
+                            "name": "setup",
+                            "rawName": "setup"
+                        },
+                        "value": null
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            60,
+                            69
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 14
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 23
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                60,
+                                64
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 14
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 18
+                                }
+                            },
+                            "name": "lang",
+                            "rawName": "lang"
+                        },
+                        "value": {
+                            "type": "VLiteral",
+                            "range": [
+                                65,
+                                69
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 19
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 23
+                                }
+                            },
+                            "value": "ts"
+                        }
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            70,
+                            106
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 24
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 60
+                            }
+                        },
+                        "directive": true,
+                        "key": {
+                            "type": "VDirectiveKey",
+                            "range": [
+                                70,
+                                77
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 24
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 31
+                                }
+                            },
+                            "name": {
+                                "type": "VIdentifier",
+                                "range": [
+                                    70,
+                                    77
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "column": 24,
+                                        "line": 4
+                                    },
+                                    "end": {
+                                        "column": 31,
+                                        "line": 4
+                                    }
+                                },
+                                "name": "generic",
+                                "rawName": "generic"
+                            },
+                            "argument": null,
+                            "modifiers": []
+                        },
+                        "value": {
+                            "type": "VExpressionContainer",
+                            "range": [
+                                78,
+                                106
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 4,
+                                    "column": 32
+                                },
+                                "end": {
+                                    "line": 4,
+                                    "column": 60
+                                }
+                            },
+                            "expression": {
+                                "type": "VGenericExpression",
+                                "range": [
+                                    79,
+                                    105
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 4,
+                                        "column": 33
+                                    },
+                                    "end": {
+                                        "line": 4,
+                                        "column": 59
+                                    }
+                                },
+                                "params": [
+                                    {
+                                        "type": "TSTypeParameter",
+                                        "name": {
+                                            "type": "Identifier",
+                                            "name": "T",
+                                            "range": [
+                                                79,
+                                                80
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 4,
+                                                    "column": 33
+                                                },
+                                                "end": {
+                                                    "line": 4,
+                                                    "column": 34
+                                                }
+                                            }
+                                        },
+                                        "constraint": {
+                                            "type": "TSTypeReference",
+                                            "typeName": {
+                                                "type": "Identifier",
+                                                "name": "Foo",
+                                                "range": [
+                                                    89,
+                                                    92
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 4,
+                                                        "column": 43
+                                                    },
+                                                    "end": {
+                                                        "line": 4,
+                                                        "column": 46
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                89,
+                                                92
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 4,
+                                                    "column": 43
+                                                },
+                                                "end": {
+                                                    "line": 4,
+                                                    "column": 46
+                                                }
+                                            }
+                                        },
+                                        "in": false,
+                                        "out": false,
+                                        "const": false,
+                                        "range": [
+                                            79,
+                                            92
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 4,
+                                                "column": 33
+                                            },
+                                            "end": {
+                                                "line": 4,
+                                                "column": 46
+                                            }
+                                        }
+                                    },
+                                    {
+                                        "type": "TSTypeParameter",
+                                        "name": {
+                                            "type": "Identifier",
+                                            "name": "U",
+                                            "range": [
+                                                94,
+                                                95
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 4,
+                                                    "column": 48
+                                                },
+                                                "end": {
+                                                    "line": 4,
+                                                    "column": 49
+                                                }
+                                            }
+                                        },
+                                        "constraint": {
+                                            "type": "TSTypeReference",
+                                            "typeName": {
+                                                "type": "Identifier",
+                                                "name": "T",
+                                                "range": [
+                                                    104,
+                                                    105
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 4,
+                                                        "column": 58
+                                                    },
+                                                    "end": {
+                                                        "line": 4,
+                                                        "column": 59
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                104,
+                                                105
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 4,
+                                                    "column": 58
+                                                },
+                                                "end": {
+                                                    "line": 4,
+                                                    "column": 59
+                                                }
+                                            }
+                                        },
+                                        "in": false,
+                                        "out": false,
+                                        "const": false,
+                                        "range": [
+                                            94,
+                                            105
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 4,
+                                                "column": 48
+                                            },
+                                            "end": {
+                                                "line": 4,
+                                                "column": 59
+                                            }
+                                        }
+                                    }
+                                ],
+                                "rawParams": [
+                                    "T extends Foo",
+                                    "U extends T"
+                                ]
+                            },
+                            "references": [
+                                {
+                                    "id": {
+                                        "type": "Identifier",
+                                        "name": "Foo",
+                                        "range": [
+                                            89,
+                                            92
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 4,
+                                                "column": 43
+                                            },
+                                            "end": {
+                                                "line": 4,
+                                                "column": 46
+                                            }
+                                        }
+                                    },
+                                    "mode": "r",
+                                    "isValueReference": false,
+                                    "isTypeReference": true
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        107,
+                        184
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 61
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 0
+                        }
+                    },
+                    "value": "\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    184,
+                    193
+                ],
+                "loc": {
+                    "start": {
+                        "line": 8,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 8,
+                        "column": 9
+                    }
+                }
+            },
+            "variables": [
+                {
+                    "id": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "range": [
+                            79,
+                            80
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 33
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 34
+                            }
+                        }
+                    },
+                    "kind": "generic"
+                },
+                {
+                    "id": {
+                        "type": "Identifier",
+                        "name": "U",
+                        "range": [
+                            94,
+                            95
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 4,
+                                "column": 48
+                            },
+                            "end": {
+                                "line": 4,
+                                "column": 49
+                            }
+                        }
+                    },
+                    "kind": "generic"
+                }
+            ]
+        },
+        {
+            "type": "VText",
+            "range": [
+                193,
+                194
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 9
+                },
+                "end": {
+                    "line": 9,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VElement",
+            "range": [
+                194,
+                224
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 0
+                },
+                "end": {
+                    "line": 11,
+                    "column": 11
+                }
+            },
+            "name": "template",
+            "rawName": "template",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    194,
+                    204
+                ],
+                "loc": {
+                    "start": {
+                        "line": 9,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 9,
+                        "column": 10
+                    }
+                },
+                "selfClosing": false,
+                "attributes": []
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        204,
+                        205
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionContainer",
+                    "range": [
+                        205,
+                        212
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 7
+                        }
+                    },
+                    "expression": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            207,
+                            210
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 10,
+                                "column": 2
+                            },
+                            "end": {
+                                "line": 10,
+                                "column": 5
+                            }
+                        }
+                    },
+                    "references": [
+                        {
+                            "id": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "range": [
+                                    207,
+                                    210
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 10,
+                                        "column": 2
+                                    },
+                                    "end": {
+                                        "line": 10,
+                                        "column": 5
+                                    }
+                                }
+                            },
+                            "mode": "r",
+                            "isValueReference": true,
+                            "isTypeReference": false
+                        }
+                    ]
+                },
+                {
+                    "type": "VText",
+                    "range": [
+                        212,
+                        213
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    213,
+                    224
+                ],
+                "loc": {
+                    "start": {
+                        "line": 11,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 11,
+                        "column": 11
+                    }
+                }
+            },
+            "variables": [],
+            "tokens": [
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        0,
+                        7
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 7
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        7,
+                        8
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 8
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        8,
+                        9
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        9,
+                        13
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 4
+                        }
+                    },
+                    "value": "type"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        13,
+                        14
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 4
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 5
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        14,
+                        17
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 8
+                        }
+                    },
+                    "value": "Foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        17,
+                        18
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 9
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        18,
+                        19
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 10
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        19,
+                        20
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 11
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        20,
+                        26
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 11
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 17
+                        }
+                    },
+                    "value": "number"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        26,
+                        27
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 17
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 18
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        27,
+                        28
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 18
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 19
+                        }
+                    },
+                    "value": "|"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        28,
+                        29
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 19
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 20
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        29,
+                        35
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 20
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 26
+                        }
+                    },
+                    "value": "string"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        35,
+                        36
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 26
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        36,
+                        44
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 8
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        44,
+                        45
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 9
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        45,
+                        46
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        46,
+                        53
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 7
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        54,
+                        59
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 13
+                        }
+                    },
+                    "value": "setup"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        60,
+                        64
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 14
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 18
+                        }
+                    },
+                    "value": "lang"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        64,
+                        65
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 18
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 19
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLLiteral",
+                    "range": [
+                        65,
+                        69
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 19
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 23
+                        }
+                    },
+                    "value": "ts"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        70,
+                        77
+                    ],
+                    "loc": {
+                        "start": {
+                            "column": 24,
+                            "line": 4
+                        },
+                        "end": {
+                            "column": 31,
+                            "line": 4
+                        }
+                    },
+                    "value": "generic"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        77,
+                        78
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 31
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 32
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        78,
+                        79
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 32
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 33
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "Identifier",
+                    "value": "T",
+                    "range": [
+                        79,
+                        80
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 33
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 34
+                        }
+                    }
+                },
+                {
+                    "type": "Keyword",
+                    "value": "extends",
+                    "range": [
+                        81,
+                        88
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 35
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 42
+                        }
+                    }
+                },
+                {
+                    "type": "Identifier",
+                    "value": "Foo",
+                    "range": [
+                        89,
+                        92
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 43
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 46
+                        }
+                    }
+                },
+                {
+                    "type": "Punctuator",
+                    "value": ",",
+                    "range": [
+                        92,
+                        93
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 46
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 47
+                        }
+                    }
+                },
+                {
+                    "type": "Identifier",
+                    "value": "U",
+                    "range": [
+                        94,
+                        95
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 48
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 49
+                        }
+                    }
+                },
+                {
+                    "type": "Keyword",
+                    "value": "extends",
+                    "range": [
+                        96,
+                        103
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 50
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 57
+                        }
+                    }
+                },
+                {
+                    "type": "Identifier",
+                    "value": "T",
+                    "range": [
+                        104,
+                        105
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 58
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 59
+                        }
+                    }
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        105,
+                        106
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 59
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 60
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        106,
+                        107
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 60
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 61
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        107,
+                        108
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 61
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        108,
+                        113
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 5
+                        }
+                    },
+                    "value": "const"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        113,
+                        114
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 6
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        114,
+                        115
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 7
+                        }
+                    },
+                    "value": "p"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        115,
+                        116
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 8
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        116,
+                        117
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 9
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        117,
+                        118
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 10
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        118,
+                        137
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 29
+                        }
+                    },
+                    "value": "defineProps<{foo:T,"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        137,
+                        138
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 29
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 30
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        138,
+                        142
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 30
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 34
+                        }
+                    },
+                    "value": "bar:"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        142,
+                        143
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 34
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 35
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        143,
+                        148
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 35
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 40
+                        }
+                    },
+                    "value": "U}>()"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        148,
+                        149
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 40
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        149,
+                        154
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 5
+                        }
+                    },
+                    "value": "const"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        154,
+                        155
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 6
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        155,
+                        158
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 9
+                        }
+                    },
+                    "value": "foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        158,
+                        159
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 10
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        159,
+                        160
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 11
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        160,
+                        161
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 11
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 12
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        161,
+                        166
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 12
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 17
+                        }
+                    },
+                    "value": "p.foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        166,
+                        167
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 17
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        167,
+                        183
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 16
+                        }
+                    },
+                    "value": "console.log(foo)"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        183,
+                        184
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 16
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        184,
+                        192
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 8
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        192,
+                        193
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 9
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        193,
+                        194
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        194,
+                        203
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 9
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        203,
+                        204
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 10
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        204,
+                        205
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionStart",
+                    "range": [
+                        205,
+                        207
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 2
+                        }
+                    },
+                    "value": "{{"
+                },
+                {
+                    "type": "Identifier",
+                    "value": "foo",
+                    "range": [
+                        207,
+                        210
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 5
+                        }
+                    }
+                },
+                {
+                    "type": "VExpressionEnd",
+                    "range": [
+                        210,
+                        212
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 7
+                        }
+                    },
+                    "value": "}}"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        212,
+                        213
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        213,
+                        223
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 11,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 10
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        223,
+                        224
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 11,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 11
+                        }
+                    },
+                    "value": ""
+                }
+            ],
+            "comments": [],
+            "errors": []
+        }
+    ],
+    "tokens": [
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                0,
+                7
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 1,
+                    "column": 7
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                7,
+                8
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 7
+                },
+                "end": {
+                    "line": 1,
+                    "column": 8
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                8,
+                9
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 8
+                },
+                "end": {
+                    "line": 2,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                9,
+                13
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 0
+                },
+                "end": {
+                    "line": 2,
+                    "column": 4
+                }
+            },
+            "value": "type"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                13,
+                14
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 4
+                },
+                "end": {
+                    "line": 2,
+                    "column": 5
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                14,
+                17
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 5
+                },
+                "end": {
+                    "line": 2,
+                    "column": 8
+                }
+            },
+            "value": "Foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                17,
+                18
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 8
+                },
+                "end": {
+                    "line": 2,
+                    "column": 9
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                18,
+                19
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 9
+                },
+                "end": {
+                    "line": 2,
+                    "column": 10
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                19,
+                20
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 10
+                },
+                "end": {
+                    "line": 2,
+                    "column": 11
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                20,
+                26
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 11
+                },
+                "end": {
+                    "line": 2,
+                    "column": 17
+                }
+            },
+            "value": "number"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                26,
+                27
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 17
+                },
+                "end": {
+                    "line": 2,
+                    "column": 18
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                27,
+                28
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 18
+                },
+                "end": {
+                    "line": 2,
+                    "column": 19
+                }
+            },
+            "value": "|"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                28,
+                29
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 19
+                },
+                "end": {
+                    "line": 2,
+                    "column": 20
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                29,
+                35
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 20
+                },
+                "end": {
+                    "line": 2,
+                    "column": 26
+                }
+            },
+            "value": "string"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                35,
+                36
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 26
+                },
+                "end": {
+                    "line": 3,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                36,
+                44
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 0
+                },
+                "end": {
+                    "line": 3,
+                    "column": 8
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                44,
+                45
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 8
+                },
+                "end": {
+                    "line": 3,
+                    "column": 9
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                45,
+                46
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 9
+                },
+                "end": {
+                    "line": 4,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                46,
+                53
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 0
+                },
+                "end": {
+                    "line": 4,
+                    "column": 7
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                54,
+                59
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 8
+                },
+                "end": {
+                    "line": 4,
+                    "column": 13
+                }
+            },
+            "value": "setup"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                60,
+                64
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 14
+                },
+                "end": {
+                    "line": 4,
+                    "column": 18
+                }
+            },
+            "value": "lang"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                64,
+                65
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 18
+                },
+                "end": {
+                    "line": 4,
+                    "column": 19
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLLiteral",
+            "range": [
+                65,
+                69
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 19
+                },
+                "end": {
+                    "line": 4,
+                    "column": 23
+                }
+            },
+            "value": "ts"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                70,
+                77
+            ],
+            "loc": {
+                "start": {
+                    "column": 24,
+                    "line": 4
+                },
+                "end": {
+                    "column": 31,
+                    "line": 4
+                }
+            },
+            "value": "generic"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                77,
+                78
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 31
+                },
+                "end": {
+                    "line": 4,
+                    "column": 32
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                78,
+                79
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 32
+                },
+                "end": {
+                    "line": 4,
+                    "column": 33
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                79,
+                80
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 33
+                },
+                "end": {
+                    "line": 4,
+                    "column": 34
+                }
+            }
+        },
+        {
+            "type": "Keyword",
+            "value": "extends",
+            "range": [
+                81,
+                88
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 35
+                },
+                "end": {
+                    "line": 4,
+                    "column": 42
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "Foo",
+            "range": [
+                89,
+                92
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 43
+                },
+                "end": {
+                    "line": 4,
+                    "column": 46
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ",",
+            "range": [
+                92,
+                93
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 46
+                },
+                "end": {
+                    "line": 4,
+                    "column": 47
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "U",
+            "range": [
+                94,
+                95
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 48
+                },
+                "end": {
+                    "line": 4,
+                    "column": 49
+                }
+            }
+        },
+        {
+            "type": "Keyword",
+            "value": "extends",
+            "range": [
+                96,
+                103
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 50
+                },
+                "end": {
+                    "line": 4,
+                    "column": 57
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                104,
+                105
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 58
+                },
+                "end": {
+                    "line": 4,
+                    "column": 59
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                105,
+                106
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 59
+                },
+                "end": {
+                    "line": 4,
+                    "column": 60
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                106,
+                107
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 60
+                },
+                "end": {
+                    "line": 4,
+                    "column": 61
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                107,
+                108
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 61
+                },
+                "end": {
+                    "line": 5,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                108,
+                113
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 0
+                },
+                "end": {
+                    "line": 5,
+                    "column": 5
+                }
+            },
+            "value": "const"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                113,
+                114
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 5
+                },
+                "end": {
+                    "line": 5,
+                    "column": 6
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                114,
+                115
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 6
+                },
+                "end": {
+                    "line": 5,
+                    "column": 7
+                }
+            },
+            "value": "p"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                115,
+                116
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 7
+                },
+                "end": {
+                    "line": 5,
+                    "column": 8
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                116,
+                117
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 8
+                },
+                "end": {
+                    "line": 5,
+                    "column": 9
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                117,
+                118
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 9
+                },
+                "end": {
+                    "line": 5,
+                    "column": 10
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                118,
+                137
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 10
+                },
+                "end": {
+                    "line": 5,
+                    "column": 29
+                }
+            },
+            "value": "defineProps<{foo:T,"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                137,
+                138
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 29
+                },
+                "end": {
+                    "line": 5,
+                    "column": 30
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                138,
+                142
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 30
+                },
+                "end": {
+                    "line": 5,
+                    "column": 34
+                }
+            },
+            "value": "bar:"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                142,
+                143
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 34
+                },
+                "end": {
+                    "line": 5,
+                    "column": 35
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                143,
+                148
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 35
+                },
+                "end": {
+                    "line": 5,
+                    "column": 40
+                }
+            },
+            "value": "U}>()"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                148,
+                149
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 40
+                },
+                "end": {
+                    "line": 6,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                149,
+                154
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 0
+                },
+                "end": {
+                    "line": 6,
+                    "column": 5
+                }
+            },
+            "value": "const"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                154,
+                155
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 5
+                },
+                "end": {
+                    "line": 6,
+                    "column": 6
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                155,
+                158
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 6
+                },
+                "end": {
+                    "line": 6,
+                    "column": 9
+                }
+            },
+            "value": "foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                158,
+                159
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 9
+                },
+                "end": {
+                    "line": 6,
+                    "column": 10
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                159,
+                160
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 10
+                },
+                "end": {
+                    "line": 6,
+                    "column": 11
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                160,
+                161
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 11
+                },
+                "end": {
+                    "line": 6,
+                    "column": 12
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                161,
+                166
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 12
+                },
+                "end": {
+                    "line": 6,
+                    "column": 17
+                }
+            },
+            "value": "p.foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                166,
+                167
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 17
+                },
+                "end": {
+                    "line": 7,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                167,
+                183
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 0
+                },
+                "end": {
+                    "line": 7,
+                    "column": 16
+                }
+            },
+            "value": "console.log(foo)"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                183,
+                184
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 16
+                },
+                "end": {
+                    "line": 8,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                184,
+                192
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 0
+                },
+                "end": {
+                    "line": 8,
+                    "column": 8
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                192,
+                193
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 8
+                },
+                "end": {
+                    "line": 8,
+                    "column": 9
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                193,
+                194
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 9
+                },
+                "end": {
+                    "line": 9,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                194,
+                203
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 0
+                },
+                "end": {
+                    "line": 9,
+                    "column": 9
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                203,
+                204
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 9
+                },
+                "end": {
+                    "line": 9,
+                    "column": 10
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                204,
+                205
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 10
+                },
+                "end": {
+                    "line": 10,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VExpressionStart",
+            "range": [
+                205,
+                207
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 0
+                },
+                "end": {
+                    "line": 10,
+                    "column": 2
+                }
+            },
+            "value": "{{"
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                207,
+                210
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 2
+                },
+                "end": {
+                    "line": 10,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "VExpressionEnd",
+            "range": [
+                210,
+                212
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 5
+                },
+                "end": {
+                    "line": 10,
+                    "column": 7
+                }
+            },
+            "value": "}}"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                212,
+                213
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 7
+                },
+                "end": {
+                    "line": 11,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                213,
+                223
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 0
+                },
+                "end": {
+                    "line": 11,
+                    "column": 10
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                223,
+                224
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 10
+                },
+                "end": {
+                    "line": 11,
+                    "column": 11
+                }
+            },
+            "value": ""
+        }
+    ],
+    "comments": [],
+    "errors": []
+}
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-3/parser-options.json b/test/fixtures/document-fragment/vue3.3-generic-3/parser-options.json
new file mode 100644
index 00000000..0ead30e9
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-3/parser-options.json
@@ -0,0 +1,6 @@
+{
+  "sourceType": "module",
+  "parser": {
+    "ts": "@typescript-eslint/parser"
+  }
+}
diff --git a/test/fixtures/document-fragment/vue3.3-generic-3/source.vue b/test/fixtures/document-fragment/vue3.3-generic-3/source.vue
new file mode 100644
index 00000000..5d3590d2
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-3/source.vue
@@ -0,0 +1,11 @@
+<script>
+type Foo = number | string
+</script>
+<script setup lang="ts" generic="T extends Foo, U extends T">
+const p = defineProps<{foo:T, bar: U}>()
+const foo = p.foo
+console.log(foo)
+</script>
+<template>
+{{foo}}
+</template>
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-3/token-ranges.json b/test/fixtures/document-fragment/vue3.3-generic-3/token-ranges.json
new file mode 100644
index 00000000..2c199c64
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-3/token-ranges.json
@@ -0,0 +1,72 @@
+[
+    "<script",
+    ">",
+    "\n",
+    "type",
+    " ",
+    "Foo",
+    " ",
+    "=",
+    " ",
+    "number",
+    " ",
+    "|",
+    " ",
+    "string",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<script",
+    "setup",
+    "lang",
+    "=",
+    "\"ts\"",
+    "generic",
+    "=",
+    "\"",
+    "T",
+    "extends",
+    "Foo",
+    ",",
+    "U",
+    "extends",
+    "T",
+    "\"",
+    ">",
+    "\n",
+    "const",
+    " ",
+    "p",
+    " ",
+    "=",
+    " ",
+    "defineProps<{foo:T,",
+    " ",
+    "bar:",
+    " ",
+    "U}>()",
+    "\n",
+    "const",
+    " ",
+    "foo",
+    " ",
+    "=",
+    " ",
+    "p.foo",
+    "\n",
+    "console.log(foo)",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<template",
+    ">",
+    "\n",
+    "{{",
+    "foo",
+    "}}",
+    "\n",
+    "</template",
+    ">"
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-3/tree.json b/test/fixtures/document-fragment/vue3.3-generic-3/tree.json
new file mode 100644
index 00000000..39979906
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-3/tree.json
@@ -0,0 +1,198 @@
+[
+    {
+        "type": "VDocumentFragment",
+        "text": "<script>\ntype Foo = number | string\n</script>\n<script setup lang=\"ts\" generic=\"T extends Foo, U extends T\">\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n</script>\n<template>\n{{foo}}\n</template>",
+        "children": [
+            {
+                "type": "VElement",
+                "text": "<script>\ntype Foo = number | string\n</script>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<script>",
+                        "children": []
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\ntype Foo = number | string\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</script>",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VElement",
+                "text": "<script setup lang=\"ts\" generic=\"T extends Foo, U extends T\">\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n</script>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<script setup lang=\"ts\" generic=\"T extends Foo, U extends T\">",
+                        "children": [
+                            {
+                                "type": "VAttribute",
+                                "text": "setup",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "setup",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "lang=\"ts\"",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "lang",
+                                        "children": []
+                                    },
+                                    {
+                                        "type": "VLiteral",
+                                        "text": "\"ts\"",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "generic=\"T extends Foo, U extends T\"",
+                                "children": [
+                                    {
+                                        "type": "VDirectiveKey",
+                                        "text": "generic",
+                                        "children": [
+                                            {
+                                                "type": "VIdentifier",
+                                                "text": "generic",
+                                                "children": []
+                                            }
+                                        ]
+                                    },
+                                    {
+                                        "type": "VExpressionContainer",
+                                        "text": "\"T extends Foo, U extends T\"",
+                                        "children": [
+                                            {
+                                                "type": "VGenericExpression",
+                                                "text": "T extends Foo, U extends T",
+                                                "children": [
+                                                    {
+                                                        "type": "TSTypeParameter",
+                                                        "text": "T extends Foo",
+                                                        "children": [
+                                                            {
+                                                                "type": "Identifier",
+                                                                "text": "T",
+                                                                "children": []
+                                                            },
+                                                            {
+                                                                "type": "TSTypeReference",
+                                                                "text": "Foo",
+                                                                "children": [
+                                                                    {
+                                                                        "type": "Identifier",
+                                                                        "text": "Foo",
+                                                                        "children": []
+                                                                    }
+                                                                ]
+                                                            }
+                                                        ]
+                                                    },
+                                                    {
+                                                        "type": "TSTypeParameter",
+                                                        "text": "U extends T",
+                                                        "children": [
+                                                            {
+                                                                "type": "Identifier",
+                                                                "text": "U",
+                                                                "children": []
+                                                            },
+                                                            {
+                                                                "type": "TSTypeReference",
+                                                                "text": "T",
+                                                                "children": [
+                                                                    {
+                                                                        "type": "Identifier",
+                                                                        "text": "T",
+                                                                        "children": []
+                                                                    }
+                                                                ]
+                                                            }
+                                                        ]
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</script>",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VElement",
+                "text": "<template>\n{{foo}}\n</template>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<template>",
+                        "children": []
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VExpressionContainer",
+                        "text": "{{foo}}",
+                        "children": [
+                            {
+                                "type": "Identifier",
+                                "text": "foo",
+                                "children": []
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</template>",
+                        "children": []
+                    }
+                ]
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/document-fragment.json b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/document-fragment.json
new file mode 100644
index 00000000..23514a87
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/document-fragment.json
@@ -0,0 +1,3023 @@
+{
+    "type": "VDocumentFragment",
+    "range": [
+        0,
+        235
+    ],
+    "loc": {
+        "start": {
+            "line": 1,
+            "column": 0
+        },
+        "end": {
+            "line": 15,
+            "column": 11
+        }
+    },
+    "children": [
+        {
+            "type": "VElement",
+            "range": [
+                0,
+                204
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 12,
+                    "column": 9
+                }
+            },
+            "name": "script",
+            "rawName": "script",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    0,
+                    91
+                ],
+                "loc": {
+                    "start": {
+                        "line": 1,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 7,
+                        "column": 2
+                    }
+                },
+                "selfClosing": false,
+                "attributes": [
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            8,
+                            13
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 1,
+                                "column": 8
+                            },
+                            "end": {
+                                "line": 1,
+                                "column": 13
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                8,
+                                13
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 8
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 13
+                                }
+                            },
+                            "name": "setup",
+                            "rawName": "setup"
+                        },
+                        "value": null
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            14,
+                            23
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 1,
+                                "column": 14
+                            },
+                            "end": {
+                                "line": 1,
+                                "column": 23
+                            }
+                        },
+                        "directive": false,
+                        "key": {
+                            "type": "VIdentifier",
+                            "range": [
+                                14,
+                                18
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 14
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 18
+                                }
+                            },
+                            "name": "lang",
+                            "rawName": "lang"
+                        },
+                        "value": {
+                            "type": "VLiteral",
+                            "range": [
+                                19,
+                                23
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 19
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 23
+                                }
+                            },
+                            "value": "ts"
+                        }
+                    },
+                    {
+                        "type": "VAttribute",
+                        "range": [
+                            24,
+                            90
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 1,
+                                "column": 24
+                            },
+                            "end": {
+                                "line": 7,
+                                "column": 1
+                            }
+                        },
+                        "directive": true,
+                        "key": {
+                            "type": "VDirectiveKey",
+                            "range": [
+                                24,
+                                31
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 24
+                                },
+                                "end": {
+                                    "line": 1,
+                                    "column": 31
+                                }
+                            },
+                            "name": {
+                                "type": "VIdentifier",
+                                "range": [
+                                    24,
+                                    31
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "column": 24,
+                                        "line": 1
+                                    },
+                                    "end": {
+                                        "column": 31,
+                                        "line": 1
+                                    }
+                                },
+                                "name": "generic",
+                                "rawName": "generic"
+                            },
+                            "argument": null,
+                            "modifiers": []
+                        },
+                        "value": {
+                            "type": "VExpressionContainer",
+                            "range": [
+                                32,
+                                90
+                            ],
+                            "loc": {
+                                "start": {
+                                    "line": 1,
+                                    "column": 32
+                                },
+                                "end": {
+                                    "line": 7,
+                                    "column": 1
+                                }
+                            },
+                            "expression": {
+                                "type": "VGenericExpression",
+                                "range": [
+                                    36,
+                                    88
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 2,
+                                        "column": 2
+                                    },
+                                    "end": {
+                                        "line": 6,
+                                        "column": 5
+                                    }
+                                },
+                                "params": [
+                                    {
+                                        "type": "TSTypeParameter",
+                                        "name": {
+                                            "type": "Identifier",
+                                            "name": "T",
+                                            "range": [
+                                                36,
+                                                37
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 2,
+                                                    "column": 2
+                                                },
+                                                "end": {
+                                                    "line": 2,
+                                                    "column": 3
+                                                }
+                                            }
+                                        },
+                                        "constraint": {
+                                            "type": "TSTypeReference",
+                                            "typeName": {
+                                                "type": "Identifier",
+                                                "name": "Foo",
+                                                "range": [
+                                                    50,
+                                                    53
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 3,
+                                                        "column": 12
+                                                    },
+                                                    "end": {
+                                                        "line": 3,
+                                                        "column": 15
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                50,
+                                                53
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 3,
+                                                    "column": 12
+                                                },
+                                                "end": {
+                                                    "line": 3,
+                                                    "column": 15
+                                                }
+                                            }
+                                        },
+                                        "in": false,
+                                        "out": false,
+                                        "const": false,
+                                        "range": [
+                                            36,
+                                            53
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 2,
+                                                "column": 2
+                                            },
+                                            "end": {
+                                                "line": 3,
+                                                "column": 15
+                                            }
+                                        }
+                                    },
+                                    {
+                                        "type": "TSTypeParameter",
+                                        "name": {
+                                            "type": "Identifier",
+                                            "name": "U",
+                                            "range": [
+                                                73,
+                                                74
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 5,
+                                                    "column": 2
+                                                },
+                                                "end": {
+                                                    "line": 5,
+                                                    "column": 3
+                                                }
+                                            }
+                                        },
+                                        "constraint": {
+                                            "type": "TSTypeReference",
+                                            "typeName": {
+                                                "type": "Identifier",
+                                                "name": "T",
+                                                "range": [
+                                                    87,
+                                                    88
+                                                ],
+                                                "loc": {
+                                                    "start": {
+                                                        "line": 6,
+                                                        "column": 4
+                                                    },
+                                                    "end": {
+                                                        "line": 6,
+                                                        "column": 5
+                                                    }
+                                                }
+                                            },
+                                            "range": [
+                                                87,
+                                                88
+                                            ],
+                                            "loc": {
+                                                "start": {
+                                                    "line": 6,
+                                                    "column": 4
+                                                },
+                                                "end": {
+                                                    "line": 6,
+                                                    "column": 5
+                                                }
+                                            }
+                                        },
+                                        "in": false,
+                                        "out": false,
+                                        "const": false,
+                                        "range": [
+                                            73,
+                                            88
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 5,
+                                                "column": 2
+                                            },
+                                            "end": {
+                                                "line": 6,
+                                                "column": 5
+                                            }
+                                        }
+                                    }
+                                ],
+                                "rawParams": [
+                                    "T\n    extends Foo",
+                                    "U extends\n    T"
+                                ]
+                            },
+                            "references": [
+                                {
+                                    "id": {
+                                        "type": "Identifier",
+                                        "name": "Foo",
+                                        "range": [
+                                            50,
+                                            53
+                                        ],
+                                        "loc": {
+                                            "start": {
+                                                "line": 3,
+                                                "column": 12
+                                            },
+                                            "end": {
+                                                "line": 3,
+                                                "column": 15
+                                            }
+                                        }
+                                    },
+                                    "mode": "r",
+                                    "isValueReference": false,
+                                    "isTypeReference": true
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        91,
+                        195
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 12,
+                            "column": 0
+                        }
+                    },
+                    "value": "\ntype Foo = number | string\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    195,
+                    204
+                ],
+                "loc": {
+                    "start": {
+                        "line": 12,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 12,
+                        "column": 9
+                    }
+                }
+            },
+            "variables": [
+                {
+                    "id": {
+                        "type": "Identifier",
+                        "name": "T",
+                        "range": [
+                            36,
+                            37
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 2,
+                                "column": 2
+                            },
+                            "end": {
+                                "line": 2,
+                                "column": 3
+                            }
+                        }
+                    },
+                    "kind": "generic"
+                },
+                {
+                    "id": {
+                        "type": "Identifier",
+                        "name": "U",
+                        "range": [
+                            73,
+                            74
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 5,
+                                "column": 2
+                            },
+                            "end": {
+                                "line": 5,
+                                "column": 3
+                            }
+                        }
+                    },
+                    "kind": "generic"
+                }
+            ]
+        },
+        {
+            "type": "VText",
+            "range": [
+                204,
+                205
+            ],
+            "loc": {
+                "start": {
+                    "line": 12,
+                    "column": 9
+                },
+                "end": {
+                    "line": 13,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VElement",
+            "range": [
+                205,
+                235
+            ],
+            "loc": {
+                "start": {
+                    "line": 13,
+                    "column": 0
+                },
+                "end": {
+                    "line": 15,
+                    "column": 11
+                }
+            },
+            "name": "template",
+            "rawName": "template",
+            "namespace": "http://www.w3.org/1999/xhtml",
+            "startTag": {
+                "type": "VStartTag",
+                "range": [
+                    205,
+                    215
+                ],
+                "loc": {
+                    "start": {
+                        "line": 13,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 13,
+                        "column": 10
+                    }
+                },
+                "selfClosing": false,
+                "attributes": []
+            },
+            "children": [
+                {
+                    "type": "VText",
+                    "range": [
+                        215,
+                        216
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 13,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 14,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionContainer",
+                    "range": [
+                        216,
+                        223
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 14,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 14,
+                            "column": 7
+                        }
+                    },
+                    "expression": {
+                        "type": "Identifier",
+                        "name": "foo",
+                        "range": [
+                            218,
+                            221
+                        ],
+                        "loc": {
+                            "start": {
+                                "line": 14,
+                                "column": 2
+                            },
+                            "end": {
+                                "line": 14,
+                                "column": 5
+                            }
+                        }
+                    },
+                    "references": [
+                        {
+                            "id": {
+                                "type": "Identifier",
+                                "name": "foo",
+                                "range": [
+                                    218,
+                                    221
+                                ],
+                                "loc": {
+                                    "start": {
+                                        "line": 14,
+                                        "column": 2
+                                    },
+                                    "end": {
+                                        "line": 14,
+                                        "column": 5
+                                    }
+                                }
+                            },
+                            "mode": "r",
+                            "isValueReference": true,
+                            "isTypeReference": false
+                        }
+                    ]
+                },
+                {
+                    "type": "VText",
+                    "range": [
+                        223,
+                        224
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 14,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 15,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                }
+            ],
+            "endTag": {
+                "type": "VEndTag",
+                "range": [
+                    224,
+                    235
+                ],
+                "loc": {
+                    "start": {
+                        "line": 15,
+                        "column": 0
+                    },
+                    "end": {
+                        "line": 15,
+                        "column": 11
+                    }
+                }
+            },
+            "variables": [],
+            "tokens": [
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        0,
+                        7
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 7
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        8,
+                        13
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 13
+                        }
+                    },
+                    "value": "setup"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        14,
+                        18
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 14
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 18
+                        }
+                    },
+                    "value": "lang"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        18,
+                        19
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 18
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 19
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLLiteral",
+                    "range": [
+                        19,
+                        23
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 19
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 23
+                        }
+                    },
+                    "value": "ts"
+                },
+                {
+                    "type": "HTMLIdentifier",
+                    "range": [
+                        24,
+                        31
+                    ],
+                    "loc": {
+                        "start": {
+                            "column": 24,
+                            "line": 1
+                        },
+                        "end": {
+                            "column": 31,
+                            "line": 1
+                        }
+                    },
+                    "value": "generic"
+                },
+                {
+                    "type": "HTMLAssociation",
+                    "range": [
+                        31,
+                        32
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 31
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 32
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        32,
+                        33
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 1,
+                            "column": 32
+                        },
+                        "end": {
+                            "line": 1,
+                            "column": 33
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "Identifier",
+                    "value": "T",
+                    "range": [
+                        36,
+                        37
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 2,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 2,
+                            "column": 3
+                        }
+                    }
+                },
+                {
+                    "type": "Keyword",
+                    "value": "extends",
+                    "range": [
+                        42,
+                        49
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 4
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 11
+                        }
+                    }
+                },
+                {
+                    "type": "Identifier",
+                    "value": "Foo",
+                    "range": [
+                        50,
+                        53
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 12
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 15
+                        }
+                    }
+                },
+                {
+                    "type": "Punctuator",
+                    "value": ",",
+                    "range": [
+                        53,
+                        54
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 3,
+                            "column": 15
+                        },
+                        "end": {
+                            "line": 3,
+                            "column": 16
+                        }
+                    }
+                },
+                {
+                    "type": "Identifier",
+                    "value": "U",
+                    "range": [
+                        73,
+                        74
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 3
+                        }
+                    }
+                },
+                {
+                    "type": "Keyword",
+                    "value": "extends",
+                    "range": [
+                        75,
+                        82
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 5,
+                            "column": 4
+                        },
+                        "end": {
+                            "line": 5,
+                            "column": 11
+                        }
+                    }
+                },
+                {
+                    "type": "Identifier",
+                    "value": "T",
+                    "range": [
+                        87,
+                        88
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 6,
+                            "column": 4
+                        },
+                        "end": {
+                            "line": 6,
+                            "column": 5
+                        }
+                    }
+                },
+                {
+                    "type": "Punctuator",
+                    "range": [
+                        89,
+                        90
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 1
+                        }
+                    },
+                    "value": "\""
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        90,
+                        91
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 1
+                        },
+                        "end": {
+                            "line": 7,
+                            "column": 2
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        91,
+                        92
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 7,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        92,
+                        96
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 4
+                        }
+                    },
+                    "value": "type"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        96,
+                        97
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 4
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 5
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        97,
+                        100
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 8
+                        }
+                    },
+                    "value": "Foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        100,
+                        101
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 9
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        101,
+                        102
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 10
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        102,
+                        103
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 11
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        103,
+                        109
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 11
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 17
+                        }
+                    },
+                    "value": "number"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        109,
+                        110
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 17
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 18
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        110,
+                        111
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 18
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 19
+                        }
+                    },
+                    "value": "|"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        111,
+                        112
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 19
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 20
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        112,
+                        118
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 20
+                        },
+                        "end": {
+                            "line": 8,
+                            "column": 26
+                        }
+                    },
+                    "value": "string"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        118,
+                        119
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 8,
+                            "column": 26
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        119,
+                        124
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 5
+                        }
+                    },
+                    "value": "const"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        124,
+                        125
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 6
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        125,
+                        126
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 7
+                        }
+                    },
+                    "value": "p"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        126,
+                        127
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 8
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        127,
+                        128
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 9
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        128,
+                        129
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 10
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        129,
+                        148
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 29
+                        }
+                    },
+                    "value": "defineProps<{foo:T,"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        148,
+                        149
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 29
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 30
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        149,
+                        153
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 30
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 34
+                        }
+                    },
+                    "value": "bar:"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        153,
+                        154
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 34
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 35
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        154,
+                        159
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 35
+                        },
+                        "end": {
+                            "line": 9,
+                            "column": 40
+                        }
+                    },
+                    "value": "U}>()"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        159,
+                        160
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 9,
+                            "column": 40
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        160,
+                        165
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 5
+                        }
+                    },
+                    "value": "const"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        165,
+                        166
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 6
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        166,
+                        169
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 6
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 9
+                        }
+                    },
+                    "value": "foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        169,
+                        170
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 10
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        170,
+                        171
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 11
+                        }
+                    },
+                    "value": "="
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        171,
+                        172
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 11
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 12
+                        }
+                    },
+                    "value": " "
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        172,
+                        177
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 12
+                        },
+                        "end": {
+                            "line": 10,
+                            "column": 17
+                        }
+                    },
+                    "value": "p.foo"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        177,
+                        178
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 10,
+                            "column": 17
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLRawText",
+                    "range": [
+                        178,
+                        194
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 11,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 11,
+                            "column": 16
+                        }
+                    },
+                    "value": "console.log(foo)"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        194,
+                        195
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 11,
+                            "column": 16
+                        },
+                        "end": {
+                            "line": 12,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        195,
+                        203
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 12,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 12,
+                            "column": 8
+                        }
+                    },
+                    "value": "script"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        203,
+                        204
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 12,
+                            "column": 8
+                        },
+                        "end": {
+                            "line": 12,
+                            "column": 9
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        204,
+                        205
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 12,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 13,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLTagOpen",
+                    "range": [
+                        205,
+                        214
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 13,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 13,
+                            "column": 9
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        214,
+                        215
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 13,
+                            "column": 9
+                        },
+                        "end": {
+                            "line": 13,
+                            "column": 10
+                        }
+                    },
+                    "value": ""
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        215,
+                        216
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 13,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 14,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "VExpressionStart",
+                    "range": [
+                        216,
+                        218
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 14,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 14,
+                            "column": 2
+                        }
+                    },
+                    "value": "{{"
+                },
+                {
+                    "type": "Identifier",
+                    "value": "foo",
+                    "range": [
+                        218,
+                        221
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 14,
+                            "column": 2
+                        },
+                        "end": {
+                            "line": 14,
+                            "column": 5
+                        }
+                    }
+                },
+                {
+                    "type": "VExpressionEnd",
+                    "range": [
+                        221,
+                        223
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 14,
+                            "column": 5
+                        },
+                        "end": {
+                            "line": 14,
+                            "column": 7
+                        }
+                    },
+                    "value": "}}"
+                },
+                {
+                    "type": "HTMLWhitespace",
+                    "range": [
+                        223,
+                        224
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 14,
+                            "column": 7
+                        },
+                        "end": {
+                            "line": 15,
+                            "column": 0
+                        }
+                    },
+                    "value": "\n"
+                },
+                {
+                    "type": "HTMLEndTagOpen",
+                    "range": [
+                        224,
+                        234
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 15,
+                            "column": 0
+                        },
+                        "end": {
+                            "line": 15,
+                            "column": 10
+                        }
+                    },
+                    "value": "template"
+                },
+                {
+                    "type": "HTMLTagClose",
+                    "range": [
+                        234,
+                        235
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 15,
+                            "column": 10
+                        },
+                        "end": {
+                            "line": 15,
+                            "column": 11
+                        }
+                    },
+                    "value": ""
+                }
+            ],
+            "comments": [
+                {
+                    "type": "Line",
+                    "value": " Comments",
+                    "range": [
+                        59,
+                        70
+                    ],
+                    "loc": {
+                        "start": {
+                            "line": 4,
+                            "column": 4
+                        },
+                        "end": {
+                            "line": 4,
+                            "column": 15
+                        }
+                    }
+                }
+            ],
+            "errors": []
+        }
+    ],
+    "tokens": [
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                0,
+                7
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 0
+                },
+                "end": {
+                    "line": 1,
+                    "column": 7
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                8,
+                13
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 8
+                },
+                "end": {
+                    "line": 1,
+                    "column": 13
+                }
+            },
+            "value": "setup"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                14,
+                18
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 14
+                },
+                "end": {
+                    "line": 1,
+                    "column": 18
+                }
+            },
+            "value": "lang"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                18,
+                19
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 18
+                },
+                "end": {
+                    "line": 1,
+                    "column": 19
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLLiteral",
+            "range": [
+                19,
+                23
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 19
+                },
+                "end": {
+                    "line": 1,
+                    "column": 23
+                }
+            },
+            "value": "ts"
+        },
+        {
+            "type": "HTMLIdentifier",
+            "range": [
+                24,
+                31
+            ],
+            "loc": {
+                "start": {
+                    "column": 24,
+                    "line": 1
+                },
+                "end": {
+                    "column": 31,
+                    "line": 1
+                }
+            },
+            "value": "generic"
+        },
+        {
+            "type": "HTMLAssociation",
+            "range": [
+                31,
+                32
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 31
+                },
+                "end": {
+                    "line": 1,
+                    "column": 32
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                32,
+                33
+            ],
+            "loc": {
+                "start": {
+                    "line": 1,
+                    "column": 32
+                },
+                "end": {
+                    "line": 1,
+                    "column": 33
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                36,
+                37
+            ],
+            "loc": {
+                "start": {
+                    "line": 2,
+                    "column": 2
+                },
+                "end": {
+                    "line": 2,
+                    "column": 3
+                }
+            }
+        },
+        {
+            "type": "Keyword",
+            "value": "extends",
+            "range": [
+                42,
+                49
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 4
+                },
+                "end": {
+                    "line": 3,
+                    "column": 11
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "Foo",
+            "range": [
+                50,
+                53
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 12
+                },
+                "end": {
+                    "line": 3,
+                    "column": 15
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "value": ",",
+            "range": [
+                53,
+                54
+            ],
+            "loc": {
+                "start": {
+                    "line": 3,
+                    "column": 15
+                },
+                "end": {
+                    "line": 3,
+                    "column": 16
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "U",
+            "range": [
+                73,
+                74
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 2
+                },
+                "end": {
+                    "line": 5,
+                    "column": 3
+                }
+            }
+        },
+        {
+            "type": "Keyword",
+            "value": "extends",
+            "range": [
+                75,
+                82
+            ],
+            "loc": {
+                "start": {
+                    "line": 5,
+                    "column": 4
+                },
+                "end": {
+                    "line": 5,
+                    "column": 11
+                }
+            }
+        },
+        {
+            "type": "Identifier",
+            "value": "T",
+            "range": [
+                87,
+                88
+            ],
+            "loc": {
+                "start": {
+                    "line": 6,
+                    "column": 4
+                },
+                "end": {
+                    "line": 6,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "Punctuator",
+            "range": [
+                89,
+                90
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 0
+                },
+                "end": {
+                    "line": 7,
+                    "column": 1
+                }
+            },
+            "value": "\""
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                90,
+                91
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 1
+                },
+                "end": {
+                    "line": 7,
+                    "column": 2
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                91,
+                92
+            ],
+            "loc": {
+                "start": {
+                    "line": 7,
+                    "column": 2
+                },
+                "end": {
+                    "line": 8,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                92,
+                96
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 0
+                },
+                "end": {
+                    "line": 8,
+                    "column": 4
+                }
+            },
+            "value": "type"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                96,
+                97
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 4
+                },
+                "end": {
+                    "line": 8,
+                    "column": 5
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                97,
+                100
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 5
+                },
+                "end": {
+                    "line": 8,
+                    "column": 8
+                }
+            },
+            "value": "Foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                100,
+                101
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 8
+                },
+                "end": {
+                    "line": 8,
+                    "column": 9
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                101,
+                102
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 9
+                },
+                "end": {
+                    "line": 8,
+                    "column": 10
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                102,
+                103
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 10
+                },
+                "end": {
+                    "line": 8,
+                    "column": 11
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                103,
+                109
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 11
+                },
+                "end": {
+                    "line": 8,
+                    "column": 17
+                }
+            },
+            "value": "number"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                109,
+                110
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 17
+                },
+                "end": {
+                    "line": 8,
+                    "column": 18
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                110,
+                111
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 18
+                },
+                "end": {
+                    "line": 8,
+                    "column": 19
+                }
+            },
+            "value": "|"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                111,
+                112
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 19
+                },
+                "end": {
+                    "line": 8,
+                    "column": 20
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                112,
+                118
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 20
+                },
+                "end": {
+                    "line": 8,
+                    "column": 26
+                }
+            },
+            "value": "string"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                118,
+                119
+            ],
+            "loc": {
+                "start": {
+                    "line": 8,
+                    "column": 26
+                },
+                "end": {
+                    "line": 9,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                119,
+                124
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 0
+                },
+                "end": {
+                    "line": 9,
+                    "column": 5
+                }
+            },
+            "value": "const"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                124,
+                125
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 5
+                },
+                "end": {
+                    "line": 9,
+                    "column": 6
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                125,
+                126
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 6
+                },
+                "end": {
+                    "line": 9,
+                    "column": 7
+                }
+            },
+            "value": "p"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                126,
+                127
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 7
+                },
+                "end": {
+                    "line": 9,
+                    "column": 8
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                127,
+                128
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 8
+                },
+                "end": {
+                    "line": 9,
+                    "column": 9
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                128,
+                129
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 9
+                },
+                "end": {
+                    "line": 9,
+                    "column": 10
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                129,
+                148
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 10
+                },
+                "end": {
+                    "line": 9,
+                    "column": 29
+                }
+            },
+            "value": "defineProps<{foo:T,"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                148,
+                149
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 29
+                },
+                "end": {
+                    "line": 9,
+                    "column": 30
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                149,
+                153
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 30
+                },
+                "end": {
+                    "line": 9,
+                    "column": 34
+                }
+            },
+            "value": "bar:"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                153,
+                154
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 34
+                },
+                "end": {
+                    "line": 9,
+                    "column": 35
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                154,
+                159
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 35
+                },
+                "end": {
+                    "line": 9,
+                    "column": 40
+                }
+            },
+            "value": "U}>()"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                159,
+                160
+            ],
+            "loc": {
+                "start": {
+                    "line": 9,
+                    "column": 40
+                },
+                "end": {
+                    "line": 10,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                160,
+                165
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 0
+                },
+                "end": {
+                    "line": 10,
+                    "column": 5
+                }
+            },
+            "value": "const"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                165,
+                166
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 5
+                },
+                "end": {
+                    "line": 10,
+                    "column": 6
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                166,
+                169
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 6
+                },
+                "end": {
+                    "line": 10,
+                    "column": 9
+                }
+            },
+            "value": "foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                169,
+                170
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 9
+                },
+                "end": {
+                    "line": 10,
+                    "column": 10
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                170,
+                171
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 10
+                },
+                "end": {
+                    "line": 10,
+                    "column": 11
+                }
+            },
+            "value": "="
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                171,
+                172
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 11
+                },
+                "end": {
+                    "line": 10,
+                    "column": 12
+                }
+            },
+            "value": " "
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                172,
+                177
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 12
+                },
+                "end": {
+                    "line": 10,
+                    "column": 17
+                }
+            },
+            "value": "p.foo"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                177,
+                178
+            ],
+            "loc": {
+                "start": {
+                    "line": 10,
+                    "column": 17
+                },
+                "end": {
+                    "line": 11,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLRawText",
+            "range": [
+                178,
+                194
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 0
+                },
+                "end": {
+                    "line": 11,
+                    "column": 16
+                }
+            },
+            "value": "console.log(foo)"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                194,
+                195
+            ],
+            "loc": {
+                "start": {
+                    "line": 11,
+                    "column": 16
+                },
+                "end": {
+                    "line": 12,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                195,
+                203
+            ],
+            "loc": {
+                "start": {
+                    "line": 12,
+                    "column": 0
+                },
+                "end": {
+                    "line": 12,
+                    "column": 8
+                }
+            },
+            "value": "script"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                203,
+                204
+            ],
+            "loc": {
+                "start": {
+                    "line": 12,
+                    "column": 8
+                },
+                "end": {
+                    "line": 12,
+                    "column": 9
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                204,
+                205
+            ],
+            "loc": {
+                "start": {
+                    "line": 12,
+                    "column": 9
+                },
+                "end": {
+                    "line": 13,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLTagOpen",
+            "range": [
+                205,
+                214
+            ],
+            "loc": {
+                "start": {
+                    "line": 13,
+                    "column": 0
+                },
+                "end": {
+                    "line": 13,
+                    "column": 9
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                214,
+                215
+            ],
+            "loc": {
+                "start": {
+                    "line": 13,
+                    "column": 9
+                },
+                "end": {
+                    "line": 13,
+                    "column": 10
+                }
+            },
+            "value": ""
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                215,
+                216
+            ],
+            "loc": {
+                "start": {
+                    "line": 13,
+                    "column": 10
+                },
+                "end": {
+                    "line": 14,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "VExpressionStart",
+            "range": [
+                216,
+                218
+            ],
+            "loc": {
+                "start": {
+                    "line": 14,
+                    "column": 0
+                },
+                "end": {
+                    "line": 14,
+                    "column": 2
+                }
+            },
+            "value": "{{"
+        },
+        {
+            "type": "Identifier",
+            "value": "foo",
+            "range": [
+                218,
+                221
+            ],
+            "loc": {
+                "start": {
+                    "line": 14,
+                    "column": 2
+                },
+                "end": {
+                    "line": 14,
+                    "column": 5
+                }
+            }
+        },
+        {
+            "type": "VExpressionEnd",
+            "range": [
+                221,
+                223
+            ],
+            "loc": {
+                "start": {
+                    "line": 14,
+                    "column": 5
+                },
+                "end": {
+                    "line": 14,
+                    "column": 7
+                }
+            },
+            "value": "}}"
+        },
+        {
+            "type": "HTMLWhitespace",
+            "range": [
+                223,
+                224
+            ],
+            "loc": {
+                "start": {
+                    "line": 14,
+                    "column": 7
+                },
+                "end": {
+                    "line": 15,
+                    "column": 0
+                }
+            },
+            "value": "\n"
+        },
+        {
+            "type": "HTMLEndTagOpen",
+            "range": [
+                224,
+                234
+            ],
+            "loc": {
+                "start": {
+                    "line": 15,
+                    "column": 0
+                },
+                "end": {
+                    "line": 15,
+                    "column": 10
+                }
+            },
+            "value": "template"
+        },
+        {
+            "type": "HTMLTagClose",
+            "range": [
+                234,
+                235
+            ],
+            "loc": {
+                "start": {
+                    "line": 15,
+                    "column": 10
+                },
+                "end": {
+                    "line": 15,
+                    "column": 11
+                }
+            },
+            "value": ""
+        }
+    ],
+    "comments": [
+        {
+            "type": "Line",
+            "value": " Comments",
+            "range": [
+                59,
+                70
+            ],
+            "loc": {
+                "start": {
+                    "line": 4,
+                    "column": 4
+                },
+                "end": {
+                    "line": 4,
+                    "column": 15
+                }
+            }
+        }
+    ],
+    "errors": []
+}
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/parser-options.json b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/parser-options.json
new file mode 100644
index 00000000..0ead30e9
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/parser-options.json
@@ -0,0 +1,6 @@
+{
+  "sourceType": "module",
+  "parser": {
+    "ts": "@typescript-eslint/parser"
+  }
+}
diff --git a/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/source.vue b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/source.vue
new file mode 100644
index 00000000..7b4d167f
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/source.vue
@@ -0,0 +1,15 @@
+<script setup lang="ts" generic="
+  T
+    extends Foo,
+    // Comments
+  U extends
+    T
+">
+type Foo = number | string
+const p = defineProps<{foo:T, bar: U}>()
+const foo = p.foo
+console.log(foo)
+</script>
+<template>
+{{foo}}
+</template>
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/token-ranges.json b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/token-ranges.json
new file mode 100644
index 00000000..37ed0210
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/token-ranges.json
@@ -0,0 +1,67 @@
+[
+    "<script",
+    "setup",
+    "lang",
+    "=",
+    "\"ts\"",
+    "generic",
+    "=",
+    "\"",
+    "T",
+    "extends",
+    "Foo",
+    ",",
+    "U",
+    "extends",
+    "T",
+    "\"",
+    ">",
+    "\n",
+    "type",
+    " ",
+    "Foo",
+    " ",
+    "=",
+    " ",
+    "number",
+    " ",
+    "|",
+    " ",
+    "string",
+    "\n",
+    "const",
+    " ",
+    "p",
+    " ",
+    "=",
+    " ",
+    "defineProps<{foo:T,",
+    " ",
+    "bar:",
+    " ",
+    "U}>()",
+    "\n",
+    "const",
+    " ",
+    "foo",
+    " ",
+    "=",
+    " ",
+    "p.foo",
+    "\n",
+    "console.log(foo)",
+    "\n",
+    "</script",
+    ">",
+    "\n",
+    "<template",
+    ">",
+    "\n",
+    "{{",
+    "foo",
+    "}}",
+    "\n",
+    "</template",
+    ">",
+    "// Comments"
+]
\ No newline at end of file
diff --git a/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/tree.json b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/tree.json
new file mode 100644
index 00000000..7e5efdcf
--- /dev/null
+++ b/test/fixtures/document-fragment/vue3.3-generic-4-with-spaces/tree.json
@@ -0,0 +1,172 @@
+[
+    {
+        "type": "VDocumentFragment",
+        "text": "<script setup lang=\"ts\" generic=\"\n  T\n    extends Foo,\n    // Comments\n  U extends\n    T\n\">\ntype Foo = number | string\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n</script>\n<template>\n{{foo}}\n</template>",
+        "children": [
+            {
+                "type": "VElement",
+                "text": "<script setup lang=\"ts\" generic=\"\n  T\n    extends Foo,\n    // Comments\n  U extends\n    T\n\">\ntype Foo = number | string\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n</script>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<script setup lang=\"ts\" generic=\"\n  T\n    extends Foo,\n    // Comments\n  U extends\n    T\n\">",
+                        "children": [
+                            {
+                                "type": "VAttribute",
+                                "text": "setup",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "setup",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "lang=\"ts\"",
+                                "children": [
+                                    {
+                                        "type": "VIdentifier",
+                                        "text": "lang",
+                                        "children": []
+                                    },
+                                    {
+                                        "type": "VLiteral",
+                                        "text": "\"ts\"",
+                                        "children": []
+                                    }
+                                ]
+                            },
+                            {
+                                "type": "VAttribute",
+                                "text": "generic=\"\n  T\n    extends Foo,\n    // Comments\n  U extends\n    T\n\"",
+                                "children": [
+                                    {
+                                        "type": "VDirectiveKey",
+                                        "text": "generic",
+                                        "children": [
+                                            {
+                                                "type": "VIdentifier",
+                                                "text": "generic",
+                                                "children": []
+                                            }
+                                        ]
+                                    },
+                                    {
+                                        "type": "VExpressionContainer",
+                                        "text": "\"\n  T\n    extends Foo,\n    // Comments\n  U extends\n    T\n\"",
+                                        "children": [
+                                            {
+                                                "type": "VGenericExpression",
+                                                "text": "T\n    extends Foo,\n    // Comments\n  U extends\n    T",
+                                                "children": [
+                                                    {
+                                                        "type": "TSTypeParameter",
+                                                        "text": "T\n    extends Foo",
+                                                        "children": [
+                                                            {
+                                                                "type": "Identifier",
+                                                                "text": "T",
+                                                                "children": []
+                                                            },
+                                                            {
+                                                                "type": "TSTypeReference",
+                                                                "text": "Foo",
+                                                                "children": [
+                                                                    {
+                                                                        "type": "Identifier",
+                                                                        "text": "Foo",
+                                                                        "children": []
+                                                                    }
+                                                                ]
+                                                            }
+                                                        ]
+                                                    },
+                                                    {
+                                                        "type": "TSTypeParameter",
+                                                        "text": "U extends\n    T",
+                                                        "children": [
+                                                            {
+                                                                "type": "Identifier",
+                                                                "text": "U",
+                                                                "children": []
+                                                            },
+                                                            {
+                                                                "type": "TSTypeReference",
+                                                                "text": "T",
+                                                                "children": [
+                                                                    {
+                                                                        "type": "Identifier",
+                                                                        "text": "T",
+                                                                        "children": []
+                                                                    }
+                                                                ]
+                                                            }
+                                                        ]
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\ntype Foo = number | string\nconst p = defineProps<{foo:T, bar: U}>()\nconst foo = p.foo\nconsole.log(foo)\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</script>",
+                        "children": []
+                    }
+                ]
+            },
+            {
+                "type": "VText",
+                "text": "\n",
+                "children": []
+            },
+            {
+                "type": "VElement",
+                "text": "<template>\n{{foo}}\n</template>",
+                "children": [
+                    {
+                        "type": "VStartTag",
+                        "text": "<template>",
+                        "children": []
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VExpressionContainer",
+                        "text": "{{foo}}",
+                        "children": [
+                            {
+                                "type": "Identifier",
+                                "text": "foo",
+                                "children": []
+                            }
+                        ]
+                    },
+                    {
+                        "type": "VText",
+                        "text": "\n",
+                        "children": []
+                    },
+                    {
+                        "type": "VEndTag",
+                        "text": "</template>",
+                        "children": []
+                    }
+                ]
+            }
+        ]
+    }
+]
\ No newline at end of file
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/.eslintrc.js b/test/fixtures/integrations/script-setup-with-typescript-eslint/.eslintrc.js
new file mode 100644
index 00000000..ef47614d
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/.eslintrc.js
@@ -0,0 +1,14 @@
+"use strict";
+
+module.exports = {
+  root: true,
+  parser: require.resolve("../../../../src/index.ts"),
+  parserOptions: {
+    ecmaVersion: 2020,
+    sourceType: "module",
+    parser: "@typescript-eslint/parser",
+    project: require.resolve("./tsconfig.test.json"),
+    extraFileExtensions: ['.vue']
+  },
+  plugins: ["@typescript-eslint"],
+};
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/.eslintrc.json b/test/fixtures/integrations/script-setup-with-typescript-eslint/.eslintrc.json
deleted file mode 100644
index 54de939a..00000000
--- a/test/fixtures/integrations/script-setup-with-typescript-eslint/.eslintrc.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "root": true,
-    "parser": "../../../../src/index.ts",
-    "parserOptions": {
-        "ecmaVersion": 2020,
-        "sourceType": "module",
-        "parser": "@typescript-eslint/parser"
-    },
-    "plugins": ["@typescript-eslint"]
-}
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/invalid/generic.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/invalid/generic.vue
new file mode 100644
index 00000000..f5752f73
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/invalid/generic.vue
@@ -0,0 +1,11 @@
+<script setup lang="ts" generic="T extends Foo | Bar">
+type Foo = number | string
+type Bar = number[] | string[]
+interface Props {
+  msg?: T
+  bar: U
+}
+defineProps<Props>(), {
+  msg: 'hello',
+}
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/valid/generic-with-spaces.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/valid/generic-with-spaces.vue
new file mode 100644
index 00000000..8eecb84d
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/valid/generic-with-spaces.vue
@@ -0,0 +1,13 @@
+<script setup lang="ts" generic="
+  T
+    extends Foo | Bar
+  ">
+type Foo = number | string
+type Bar = number[] | string[]
+interface Props {
+  msg?: T
+}
+defineProps<Props>(), {
+  msg: 'hello',
+}
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/valid/generic.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/valid/generic.vue
new file mode 100644
index 00000000..fce7db53
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-undef/valid/generic.vue
@@ -0,0 +1,10 @@
+<script setup lang="ts" generic="T extends Foo | Bar">
+type Foo = number | string
+type Bar = number[] | string[]
+interface Props {
+  msg?: T
+}
+defineProps<Props>(), {
+  msg: 'hello',
+}
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/output.json b/test/fixtures/integrations/script-setup-with-typescript-eslint/output.json
index 1a7e639e..af72fcf4 100644
--- a/test/fixtures/integrations/script-setup-with-typescript-eslint/output.json
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/output.json
@@ -1,4 +1,14 @@
 [
+    {
+        "filePath": "/no-undef/invalid/generic.vue",
+        "messages": [
+            {
+                "ruleId": "no-undef",
+                "line": 6,
+                "message": "'U' is not defined."
+            }
+        ]
+    },
     {
         "filePath": "/no-undef/invalid/with-defaults.vue",
         "messages": [
@@ -13,5 +23,15 @@
                 "message": "'defineProps' is not defined."
             }
         ]
+    },
+    {
+        "filePath": "/ts-no-unused-vars/invalid/generic.vue",
+        "messages": [
+            {
+                "ruleId": "@typescript-eslint/no-unused-vars",
+                "line": 4,
+                "message": "'Baz' is defined but never used."
+            }
+        ]
     }
 ]
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/package.json b/test/fixtures/integrations/script-setup-with-typescript-eslint/package.json
index c158dd6f..f16b529e 100644
--- a/test/fixtures/integrations/script-setup-with-typescript-eslint/package.json
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/package.json
@@ -1,7 +1,9 @@
 {
   "devDependencies": {
     "eslint": "^8.8.0",
-    "@typescript-eslint/parser": "^5.10.2",
-    "@typescript-eslint/eslint-plugin": "^5.10.2"
+    "@typescript-eslint/parser": "^5.57.0",
+    "@typescript-eslint/eslint-plugin": "^5.57.0",
+    "vue": "^3.2.47",
+    "typescript": "^5.0.2"
   }
 }
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/.eslintrc.json b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/.eslintrc.json
new file mode 100644
index 00000000..3b7392e3
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/.eslintrc.json
@@ -0,0 +1,5 @@
+{
+    "rules": {
+        "@typescript-eslint/no-unsafe-assignment": "error"
+    }
+}
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic1.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic1.vue
new file mode 100644
index 00000000..1f064003
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic1.vue
@@ -0,0 +1,9 @@
+<script setup lang="ts" generic="AType">
+interface Props {
+    a: AType;
+    b: string;
+}
+const props = defineProps<Props>()
+const x = props.a
+const y = props.b
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic2.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic2.vue
new file mode 100644
index 00000000..0937cd44
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic2.vue
@@ -0,0 +1,9 @@
+<script setup lang="ts" generic="AType extends string">
+interface Props {
+    a: AType;
+    b: string;
+}
+const props = defineProps<Props>()
+const x = props.a
+const y = props.b
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic3.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic3.vue
new file mode 100644
index 00000000..d440fe0c
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unsafe-assignment/valid-generic3.vue
@@ -0,0 +1,12 @@
+<script setup lang="ts" generic="
+  AType
+    extends string
+">
+interface Props {
+    a: AType;
+    b: string;
+}
+const props = defineProps<Props>()
+const x = props.a
+const y = props.b
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/.eslintrc.json b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/.eslintrc.json
new file mode 100644
index 00000000..7592b0b5
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/.eslintrc.json
@@ -0,0 +1,5 @@
+{
+    "rules": {
+        "@typescript-eslint/no-unused-vars": "error"
+    }
+}
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/invalid/generic.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/invalid/generic.vue
new file mode 100644
index 00000000..5449949b
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/invalid/generic.vue
@@ -0,0 +1,11 @@
+<script setup lang="ts" generic="T extends FooFoo | Bar">
+type FooFoo = number | string
+type Bar = number[] | string[]
+type Baz = boolean | 'foo'
+interface Props {
+  msg?: T
+}
+defineProps<Props>(), {
+  msg: 'hello',
+}
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/valid/generic.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/valid/generic.vue
new file mode 100644
index 00000000..fce7db53
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/ts-no-unused-vars/valid/generic.vue
@@ -0,0 +1,10 @@
+<script setup lang="ts" generic="T extends Foo | Bar">
+type Foo = number | string
+type Bar = number[] | string[]
+interface Props {
+  msg?: T
+}
+defineProps<Props>(), {
+  msg: 'hello',
+}
+</script>
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/tsconfig.test.json b/test/fixtures/integrations/script-setup-with-typescript-eslint/tsconfig.test.json
new file mode 100644
index 00000000..eed31ea8
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/tsconfig.test.json
@@ -0,0 +1,19 @@
+{
+    "compilerOptions": {
+        "target": "ESNext",
+        "useDefineForClassFields": true,
+        "module": "ESNext",
+        "moduleResolution": "Node",
+        "strict": true,
+        "jsx": "preserve",
+        "resolveJsonModule": true,
+        "isolatedModules": true,
+        "esModuleInterop": true,
+        "lib": ["ESNext", "DOM"],
+        "skipLibCheck": true,
+        "noEmit": true,
+        "checkJs": true,
+        "allowJs": true
+    },
+    "include": ["./vue.d.ts", "**/*.ts", "**/*.vue"]
+}
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/vue.d.ts b/test/fixtures/integrations/script-setup-with-typescript-eslint/vue.d.ts
new file mode 100644
index 00000000..be556739
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/vue.d.ts
@@ -0,0 +1 @@
+/// <reference types="vue/macros-global" />
\ No newline at end of file