Skip to content

Commit

Permalink
fix: f@ck
Browse files Browse the repository at this point in the history
  • Loading branch information
Kingwl committed Jun 13, 2022
1 parent e1e80b9 commit 0aa0a24
Show file tree
Hide file tree
Showing 10 changed files with 588 additions and 468 deletions.
11 changes: 3 additions & 8 deletions src/monaco/Monaco.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
import { setupMonacoEnv } from './env';
setupMonacoEnv();
import './monaco.contribution'
</script>
<script lang="ts" setup>
import { onMounted, onBeforeUnmount, ref, shallowRef, nextTick, watchEffect } from 'vue';
import { loadGrammars } from './grammars';
import * as monaco from 'monaco-editor-core';
import { prepareServiceVirtualFiles } from './prepare';
import { setupThemePromise, getOrCreateModel } from './utils';
// import { setupLs, setupValidate } from './ls';
const props = withDefaults(defineProps<{
value?: string
Expand Down Expand Up @@ -36,9 +37,7 @@ const currentModel = shallowRef<monaco.editor.ITextModel>(
)
)
// const documentModelMap = shallowRef(new Map([[
// currentModel.value.uri.fsPath, currentModel.value
// ]]))
prepareServiceVirtualFiles()
watchEffect(() => {
if (currentModel.value.getValue() !== props.value) {
Expand Down Expand Up @@ -81,10 +80,6 @@ onMounted(async () => {
editorInstance.onDidChangeModelContent(() => {
emits('change', editorInstance.getValue());
});
// setupValidate(editorInstance, ls);
});
onBeforeUnmount(() => {
Expand Down
2 changes: 1 addition & 1 deletion src/monaco/editor.worker.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

declare module 'monaco-editor-core/esm/vs/editor/editor.worker' {
export function initialize(callback: (ctx: any, createData: any) => any): void;
}
}
35 changes: 33 additions & 2 deletions src/monaco/monaco.contribution.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as mode from './vueMode';
import { Emitter, type IEvent, languages } from 'monaco-editor-core';
import { Emitter, type IEvent, languages, Uri } from 'monaco-editor-core';
import { debounce } from '../utils';

export interface ModeConfiguration {
hovers?: boolean
Expand All @@ -8,14 +9,20 @@ export interface ModeConfiguration {
export interface LanguageServiceDefaults {
readonly languageId: string;
readonly onDidChange: IEvent<LanguageServiceDefaults>;
readonly onExtraLibChange: IEvent<LanguageServiceDefaults>;
readonly modeConfiguration: ModeConfiguration;
addExtraLib(uri: string, content: string): void
getExtraLibs(): Record<string, string>;
}

class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
private _onDidChange = new Emitter<LanguageServiceDefaults>();
private _onExtraLibChange = new Emitter<LanguageServiceDefaults>();
private _modeConfiguration!: ModeConfiguration;
private _languageId: string;

private _extraLibs: Record<string, string> = {};

constructor(
languageId: string,
modeConfiguration: ModeConfiguration
Expand All @@ -28,6 +35,10 @@ class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
return this._onDidChange.event;
}

get onExtraLibChange(): IEvent<LanguageServiceDefaults> {
return this._onExtraLibChange.event;
}

get languageId(): string {
return this._languageId;
}
Expand All @@ -40,6 +51,20 @@ class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
this._modeConfiguration = modeConfiguration || Object.create(null);
this._onDidChange.fire(this);
}

addExtraLib(uri: string, content: string) {
this._extraLibs[uri] = content;
this.fireExtraLibChangeSoon();
}

getExtraLibs() {
return this._extraLibs;
}

private fireExtraLibChangeSoon = debounce(() => {
this._onExtraLibChange.fire(this);
console.log('fire')
}, 300)
}

const modeConfigurationDefault: Required<ModeConfiguration> = {
Expand All @@ -51,7 +76,13 @@ export const vueDefaults: LanguageServiceDefaults = new LanguageServiceDefaultsI
modeConfigurationDefault
);

(<any>languages).vue = { vueDefaults };
declare module "monaco-editor-core" {
export namespace languages {
export let vue: { vueDefaults: LanguageServiceDefaults };
}
}

languages.vue = { vueDefaults };

function getMode(): Promise<typeof mode> {
return import('./vueMode');
Expand Down
54 changes: 21 additions & 33 deletions src/monaco/prepare.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Uri, editor, languages } from 'monaco-editor-core';
import { Uri, languages } from 'monaco-editor-core';

import libEs5Content from 'typescript/lib/lib.es5.d.ts?raw';
import libDomContent from 'typescript/lib/lib.dom.d.ts?raw';
Expand All @@ -17,43 +17,31 @@ export function prepareServiceVirtualFiles() {
const libDtsUrl = Uri.parse('file:///lib.d.ts');
const libPromiseUrl = Uri.parse('file:///lib.es2015.promise.d.ts');

const libEs5Model = getOrCreateModel(libEs5Url, 'typescript', libEs5Content);
const libDomModel = getOrCreateModel(libDomUrl, 'typescript', libDomContent);
const libDtsModel = getOrCreateModel(libDtsUrl, 'typescript', libDtsContent);
const libPromiseModel = getOrCreateModel(libPromiseUrl, 'typescript', libPromiseContent);
const libEs5Model = getOrCreateModel(libEs5Url, undefined, libEs5Content);
const libDomModel = getOrCreateModel(libDomUrl, undefined, libDomContent);
const libDtsModel = getOrCreateModel(libDtsUrl, undefined, libDtsContent);
const libPromiseModel = getOrCreateModel(libPromiseUrl, undefined, libPromiseContent);

const vueUrl = Uri.parse('file:///node_modules/vue/index.d.ts');
const vueRuntimeDomUrl = Uri.parse('file:///node_modules/%40vue/runtime-dom/index.d.ts');
const vueRuntimeCoreUrl = Uri.parse('file:///node_modules/%40vue/runtime-core/index.d.ts');
const vueSharedUrl = Uri.parse('file:///node_modules/%40vue/shared/index.d.ts');
const vueReactivityUrl = Uri.parse('file:///node_modules/%40vue/reactivity/index.d.ts');

const vueModel = getOrCreateModel(vueUrl, 'typescript', vueContent);
const vueRuntimeDomModel = getOrCreateModel(vueRuntimeDomUrl, 'typescript', vueRuntimeDomContent);
const vueRuntimeCoreModel = getOrCreateModel(vueRuntimeCoreUrl, 'typescript', vueRuntimeCoreContent);
const vueSharedModel = getOrCreateModel(vueSharedUrl, 'typescript', vueSharedContent);
const vueReactivityModel = getOrCreateModel(vueReactivityUrl, 'typescript', vueReactivityContent);

const localMap = new Map<string, editor.ITextModel>();
localMap.set(libEs5Url.fsPath, libEs5Model);
localMap.set(libDomUrl.fsPath, libDomModel);
localMap.set(libPromiseUrl.fsPath, libPromiseModel);
localMap.set(libDtsUrl.fsPath, libDtsModel);

const nodeModulesMap = new Map<string, editor.ITextModel>();
nodeModulesMap.set(vueUrl.fsPath, vueModel);
nodeModulesMap.set(vueRuntimeDomUrl.fsPath, vueRuntimeDomModel);
nodeModulesMap.set(vueRuntimeCoreUrl.fsPath, vueRuntimeCoreModel);
nodeModulesMap.set(vueSharedUrl.fsPath, vueSharedModel);
nodeModulesMap.set(vueReactivityUrl.fsPath, vueReactivityModel);

languages.typescript.typescriptDefaults.addExtraLib(libEs5Model.getValue(), libEs5Url.toString());
languages.typescript.typescriptDefaults.addExtraLib(libDomModel.getValue(), libDomUrl.toString());
languages.typescript.typescriptDefaults.addExtraLib(libPromiseModel.getValue(), libPromiseUrl.toString());
languages.typescript.typescriptDefaults.addExtraLib(libDtsModel.getValue(), libDtsUrl.toString());

return {
localMap,
nodeModulesMap
}
const vueModel = getOrCreateModel(vueUrl, undefined, vueContent);
const vueRuntimeDomModel = getOrCreateModel(vueRuntimeDomUrl, undefined, vueRuntimeDomContent);
const vueRuntimeCoreModel = getOrCreateModel(vueRuntimeCoreUrl, undefined, vueRuntimeCoreContent);
const vueSharedModel = getOrCreateModel(vueSharedUrl, undefined, vueSharedContent);
const vueReactivityModel = getOrCreateModel(vueReactivityUrl, undefined, vueReactivityContent);

languages.vue.vueDefaults.addExtraLib(libEs5Model.uri.fsPath, libEs5Model.getValue());
languages.vue.vueDefaults.addExtraLib(libDomModel.uri.fsPath, libDomModel.getValue());
languages.vue.vueDefaults.addExtraLib(libPromiseModel.uri.fsPath, libPromiseModel.getValue());
languages.vue.vueDefaults.addExtraLib(libDtsModel.uri.fsPath, libDtsModel.getValue());

languages.vue.vueDefaults.addExtraLib(vueModel.uri.fsPath, vueModel.getValue());
languages.vue.vueDefaults.addExtraLib(vueRuntimeDomModel.uri.fsPath, vueRuntimeDomModel.getValue());
languages.vue.vueDefaults.addExtraLib(vueRuntimeCoreModel.uri.fsPath, vueRuntimeCoreModel.getValue());
languages.vue.vueDefaults.addExtraLib(vueSharedModel.uri.fsPath, vueSharedModel.getValue());
languages.vue.vueDefaults.addExtraLib(vueReactivityModel.uri.fsPath, vueReactivityModel.getValue());
}
50 changes: 36 additions & 14 deletions src/monaco/services.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { worker } from 'monaco-editor-core';
import type { worker } from 'monaco-editor-core';
// import { prepareServiceVirtualFiles } from './prepare';
import * as ts from 'typescript/lib/tsserverlibrary';
import {
Expand All @@ -11,42 +11,64 @@ import {
} from '@volar/vue-language-service';

export function getLanguageServiceAndDocumentsService(
getModelsMap: () => Map<string, worker.IMirrorModel>
getModels: () => worker.IMirrorModel[],
getExtraLibs: () => Record<string, string>
) {
const scriptSnapshots = new Map<string, ts.IScriptSnapshot>();

const findInModels = (fileName: string) => {
return getModels().find(x => {
return x.uri.toString() === fileName || x.uri.fsPath === fileName
});
}

const findInExtraLibs = (fileName: string): string | undefined => {
return getExtraLibs()[fileName];
}

const host: LanguageServiceHost = {
readFile(fileName) {
const modelsMap = getModelsMap();
return modelsMap.get(fileName)?.getValue()
const model = findInModels(fileName);
if (model) {
return model.getValue()
}

const extraLibs = findInExtraLibs(fileName);
return extraLibs
},
fileExists(fileName) {
const modelsMap = getModelsMap();
return modelsMap.has(fileName)
return !!(findInModels(fileName) || findInExtraLibs(fileName))
},
getCompilationSettings(): ts.CompilerOptions {
console.log('getCompilationSettings');
const modelsMap = getModelsMap();
return {
...ts.getDefaultCompilerOptions(),
allowJs: true,
jsx: ts.JsxEmit.Preserve,
module: ts.ModuleKind.ESNext,
moduleResolution: ts.ModuleResolutionKind.NodeJs,
lib: [...modelsMap.keys()],
};
},
getVueCompilationSettings() {
return {};
},
getScriptFileNames(): string[] {
console.log('getScriptFileNames');
const modelsMap = getModelsMap();
return [...Array.from(modelsMap.keys())];
const modelNames = getModels().map(x => x.uri.fsPath);
const extraLibNames = Object.keys(getExtraLibs());
const fileNames = [...modelNames, ...extraLibNames];
return fileNames;
},
getScriptVersion(fileName: string): string {
const modelsMap = getModelsMap();
return modelsMap.get(fileName)?.version?.toString() ?? 'unknown version';
const model = findInModels(fileName);
if (model) {
return `${model.version}`
}

const extraLibs = findInExtraLibs(fileName);
if (extraLibs) {
return '1'
}

return 'unknown version';
},
getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined {
console.log('getScriptSnapshot', fileName);
Expand Down
2 changes: 1 addition & 1 deletion src/monaco/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { loadWASM } from 'onigasm';
import { theme } from './themes/converted';
import onigasm from 'onigasm/lib/onigasm.wasm?url'

export function getOrCreateModel(uri: Uri, lang: string, value: string) {
export function getOrCreateModel(uri: Uri, lang: string | undefined, value: string) {
const model = editor.getModel(uri);
if (model) {
model.setValue(value);
Expand Down

0 comments on commit 0aa0a24

Please sign in to comment.