8000 feat(vscode): find all references support by antfu · Pull Request #4353 · unocss/unocss · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

feat(vscode): find all references support #4353

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Dec 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/autofix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ jobs:
env:
CYPRESS_INSTALL_BINARY: 0

- name: Lint
run: nr lint --fix
- run: nr lint --fix

- run: nr prepare

- uses: autofix-ci/action@v1
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"private": true,
"packageManager": "pnpm@9.15.1",
"scripts": {
"postinstall": "esno scripts/prepare.ts",
"prepare": "esno scripts/prepare.ts",
"taze": "taze minor -wIr && pnpm -r --parallel run update-post",
"bench": "npm -C bench run bench",
"build": "rimraf packages/*/dist --glob && esno scripts/copy-files.ts && pnpm -r --filter=./packages/* run build && pnpm -r run build-post && esno scripts/postbuild.ts",
Expand Down
22 changes: 18 additions & 4 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -678,16 +678,30 @@ export interface CliOptions {
}

export interface UnocssPluginContext<Config extends UserConfig = UserConfig> {
/**
* Singleton promise for config loading
*/
ready: Promise<LoadConfigResult<Config>>
/**
* The UnoCSS generator instance. Should be used after `ready` resolved.
*/
uno: UnoGenerator
/** All tokens scanned */
/**
* All tokens scanned
*/
tokens: Set<string>
/** Map for all module's raw content */
/**
* Map for all module's raw content
*/
modules: BetterMap<string, string>
/** Module IDs that been affected by UnoCSS */
/**
* Module IDs that been affected by UnoCSS
*/
affectedModules: Set<string>

/** Pending promises */
/**
* Pending promises
*/
tasks: Promise<any>[]
/**
* Await all pending tasks
Expand Down
25 changes: 11 additions & 14 deletions packages/vscode/src/annotation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import type { ContextLoader } from './contextLoader'
import path from 'path'
import { DecorationRangeBehavior, MarkdownString, Range, window, workspace } from 'vscode'
import { useConfigurations } from './configuration'
import { defaultIdeMatchExclude, defaultIdeMatchInclude, getMatchedPositionsFromCode, INCLUDE_COMMENT_IDE, isCssId } from './integration'
import { getMatchedPositionsFromDoc } from './getMatched'
import { INCLUDE_COMMENT_IDE, isCssId } from './integration'
import { log } from './log'
import { getColorString, getPrettiedMarkdown, throttle } from './utils'

Expand All @@ -13,13 +14,16 @@ export async function registerAnnotations(
ext: ExtensionContext,
) {
const { configuration, watchChanged, disposable } = useConfigurations(ext)
const disposals: Disposable[] = []

watchChanged(['underline', 'colorPreview', 'remToPxPreview', 'remToPxRatio', 'strictAnnotationMatch'], () => {
updateAnnotation()
})
const disposals: Disposable[] = [
disposable,
]

disposals.push(disposable)
disposals.push(
watchChanged(['underline', 'colorPreview', 'remToPxPreview', 'remToPxRatio', 'strictAnnotationMatch'], () => {
updateAnnotation()
}),
)

disposals.push(workspace.onDidSaveTextDocument(async (doc) => {
const id = doc.uri.fsPath
Expand Down Expand Up @@ -105,14 +109,7 @@ export async function registerAnnotations(
? configuration.remToPxRatio
: -1

const options = configuration.strictAnnotationMatch
? {
includeRegex: defaultIdeMatchInclude,
excludeRegex: defaultIdeMatchExclude,
}
: undefined
8000
const positions = await getMatchedPositionsFromCode(ctx.uno, code, id, options)
const positions = await getMatchedPositionsFromDoc(ctx.uno, doc)
const isAttributify = ctx.uno.config.presets.some(i => i.name === '@unocss/preset-attributify')

const ranges: DecorationOptions[] = (
Expand Down
87 changes: 21 additions & 66 deletions packages/vscode/src/autocomplete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,13 @@ import type { UnocssPluginContext, UnoGenerator } from '@unocss/core'
import type { CompletionItemProvider, Disposable, ExtensionContext } from 'vscode'
import type { ContextLoader } from './contextLoader'
import { createAutocomplete } from '@unocss/autocomplete'
import { CompletionItem, CompletionItemKind, CompletionList, languages, MarkdownString, Range, window, workspace } from 'vscode'
import { useConfigurations } from './configuration'
import { CompletionItem, CompletionItemKind, CompletionList, languages, MarkdownString, Range, window } from 'vscode'
import { getLanguageIds, useConfigurations } from './configuration'
import { delimiters } from './constants'
import { isCssId } from './integration'
import { log } from './log'
import { getColorString, getCSS, getPrettiedCSS, getPrettiedMarkdown, shouldProvideAutocomplete } from './utils'

const defaultLanguageIds = [
'erb',
'haml',
'hbs',
'html',
'css',
'postcss',
'javascript',
'javascriptreact',
'markdown',
'ejs',
'php',
'svelte',
'typescript',
'typescriptreact',
'vue-html',
'vue',
'sass',
'scss',
'less',
'stylus',
'astro',
'rust',
]
const delimiters = ['-', ':', ' ', '"', '\'']

class UnoCompletionItem extends CompletionItem {
uno: UnoGenerator
value: string
Expand All @@ -50,7 +25,6 @@ export async function registerAutoComplete(
contextLoader: ContextLoader,
ext: ExtensionContext,
) {
const allLanguages = await languages.getLanguages()
const autoCompletes = new Map<UnocssPluginContext, UnocssAutocomplete>()
const { configuration, watchChanged, disposable } = useConfigurations(ext)

Expand Down Expand Up @@ -84,21 +58,6 @@ export async function registerAutoComplete(
return new MarkdownString(await getPrettiedMarkdown(uno, util, remToPxRatio))
}

function validateLanguages(targets: string[]) {
const unValidLanguages: string[] = []
const validLanguages = targets.filter((language) => {
if (!allLanguages.includes(language)) {
unValidLanguages.push(language)
return false
}
return true
})
if (unValidLanguages.length)
window.showWarningMessage(`These language configurations are illegal: ${unValidLanguages.join(',')}`)

return validLanguages
}

const provider: CompletionItemProvider<UnoCompletionItem> = {
async provideCompletionItems(doc, position) {
const id = doc.uri.fsPath
Expand Down Expand Up @@ -176,37 +135,33 @@ export async function registerAutoComplete(

let completeUnregister: Disposable

const registerProvider = () => {
const registerProvider = async () => {
completeUnregister?.dispose?.()

const languagesIds: string[] = workspace.getConfiguration().get('unocss.languageIds') || []

const validLanguages = validateLanguages(languagesIds)

completeUnregister = languages.registerCompletionItemProvider(
defaultLanguageIds.concat(validLanguages),
await getLanguageIds(),
provider,
...delimiters,
)
return completeUnregister
}

watchChanged(['languagesIds'], () => {
ext.subscriptions.push(
registerProvider(),
)
})

watchChanged([
'matchType',
'maxItems',
'remToPxRatio',
'remToPxPreview',
], () => {
autoCompletes.clear()
})

ext.subscriptions.push(
registerProvider(),
watchChanged(['languagesIds'], async () => {
ext.subscriptions.push(
await registerProvider(),
)
}),

watchChanged([
'matchType',
'maxItems',
'remToPxRatio',
'remToPxPreview',
], () => {
autoCompletes.clear()
}),

await registerProvider(),
)
}
41 changes: 37 additions & 4 deletions packages/vscode/src/configuration.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import type { AutoCompleteMatchType } from '@unocss/autocomplete'
import type { ExtensionContext } from 'vscode'
import type { Disposable, ExtensionContext } from 'vscode'
import { toArray } from '@unocss/core'
import { workspace } from 'vscode'
import { languages, window, workspace } from 'vscode'
import { createNanoEvents } from '../../core/src/utils/events'
import { defaultLanguageIds } from './constants'

export interface UseConfigurationOptions<Init> {
ext?: ExtensionContext
Expand Down Expand Up @@ -47,10 +48,12 @@ export function getConfigurations<Init extends Record<string, unknown>>(

const emitter = createNanoEvents()

const watchChanged = <K extends keyof Init>(key: K | K[], fn: WatchConfigurationHandler<Init, K>) => {
const watchChanged = <K extends keyof Init>(key: K | K[], fn: WatchConfigurationHandler<Init, K>): Disposable => {
const keys = toArray(key)
const unsubscribes = keys.map(key => emitter.on(`update:${String(key)}`, fn))
return () => unsubscribes.forEach(fn => fn())
return {
dispose: () => unsubscribes.forEach(fn => fn()),
}
}

const disposable = workspace.onDidChangeConfiguration((e) => {
Expand Down Expand Up @@ -105,3 +108,33 @@ export function useConfigurations(ext: ExtensionContext) {
},
})
}

async function validateLanguages(targets: string[], allLanguages: string[]) {
const invalidLanguages: string[] = []
const validLanguages = targets.filter((language) => {
if (!allLanguages.includes(language)) {
invalidLanguages.push(language)
return false
}
return true
})
if (invalidLanguages.length)
window.showWarningMessage(`These language configurations are illegal: ${invalidLanguages.join(',')}`)

return validLanguages
}

export async function getLanguageIds() {
const allLanguages = await languages.getLanguages()
const languagesIds: string[] = workspace.getConfiguration().get('unocss.languageIds') || []

return Array.from(
new Set(
[
...defaultLanguageIds,
...await validateLanguages(languagesIds, allLanguages),
]
.filter(i => allLanguages.includes(i)),
),
)
}
25 changes: 25 additions & 0 deletions packages/vscode/src/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
export const defaultLanguageIds = [
'erb',
'haml',
'hbs',
'html',
'css',
'postcss',
'javascript',
'javascriptreact',
'markdown',
'ejs',
'php',
'svelte',
'typescript',
'typescriptreact',
'vue-html',
'vue',
'sass',
'scss',
'less',
'stylus',
'astro',
'rust',
]
export const delimiters = ['-', ':', ' ', '"', '\'']
1 change: 1 addition & 0 deletions packages/vscode/src/contextLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ export class ContextLoader {
(result) => {
if (result.sources.some(s => s.includes('nuxt.config')))
resolveNuxtOptions(result.config)
result.config.details = true
},
)

Expand Down
44 changes: 44 additions & 0 deletions packages/vscode/src/getMatched.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import type { UnoGenerator } from '@unocss/core'
import { getMatchedPositionsFromCode } from '@unocss/shared-common'
import { defaultIdeMatchExclude, defaultIdeMatchInclude } from '@unocss/shared-integration'
import { type ExtensionContext, type TextDocument, workspace } from 'vscode'

const cache = new Map<string, ReturnType<typeof getMatchedPositionsFromCode>>()

export function registerDocumentCacheCleaner(ext: ExtensionContext) {
ext.subscriptions.push(
workspace.onDidChangeTextDocument((e) => {
cache.delete(e.document.uri.fsPath)
}),
)
}

export function getMatchedPositionsFromDoc(
uno: UnoGenerator,
doc: TextDocument,
force = false,
) {
const id = doc.uri.fsPath
if (force)
cache.delete(id)

if (cache.has(id))
return cache.get(id)!

const options = workspace.getConfiguration('unocss').get('strictAnnotationMatch')
? {
includeRegex: defaultIdeMatchInclude,
excludeRegex: defaultIdeMatchExclude,
}
: undefined

const result = getMatchedPositionsFromCode(
uno,
doc.getText(),
id,
options,
)

cache.set(id, result)
return result
}
Loading
Loading
0