Skip to content
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

Service host file management improvement #1283

Merged
merged 12 commits into from
May 7, 2019
13 changes: 11 additions & 2 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
trigger:
- master

pr:
- master

strategy:
matrix:
linux:
Expand Down Expand Up @@ -41,7 +44,13 @@ steps:
fi
displayName: Start xvfb

- bash: yarn test
displayName: Run Tests
- bash: yarn test:server
displayName: Run Server Tests
continueOnError: true
env:
DISPLAY: :10

- bash: yarn test:e2e
displayName: Run E2E Tests
env:
DISPLAY: :10
9 changes: 7 additions & 2 deletions server/src/embeddedSupport/languageModelCache.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { TextDocument } from 'vscode-languageserver';

export interface LanguageModelCache<T> {
get(document: TextDocument): T;
/**
* - Feed updated document
* - Use `parse` function to re-compute model
* - Return re-computed model
*/
refreshAndGet(document: TextDocument): T;
onDocumentRemoved(document: TextDocument): void;
dispose(): void;
}
Expand Down Expand Up @@ -30,7 +35,7 @@ export function getLanguageModelCache<T>(
}

return {
get(document: TextDocument): T {
refreshAndGet(document: TextDocument): T {
const version = document.version;
const languageId = document.languageId;
const languageModelInfo = languageModels[document.uri];
Expand Down
13 changes: 8 additions & 5 deletions server/src/embeddedSupport/languageModes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,14 @@ export class LanguageModes {
}
}

const jsDocuments = getLanguageModelCache(10, 60, document => {
const vueDocument = this.documentRegions.get(document);
/**
* Documents where everything outside `<script>~ is replaced with whitespace
*/
const scriptRegionDocuments = getLanguageModelCache(10, 60, document => {
const vueDocument = this.documentRegions.refreshAndGet(document);
return vueDocument.getSingleTypeDocument('script');
});
this.serviceHost = getServiceHost(tsModule, workspacePath, jsDocuments);
this.serviceHost = getServiceHost(tsModule, workspacePath, scriptRegionDocuments);

const vueHtmlMode = new VueHTMLMode(
tsModule,
Expand Down Expand Up @@ -145,14 +148,14 @@ export class LanguageModes {
}

getModeAtPosition(document: TextDocument, position: Position): LanguageMode | undefined {
const languageId = this.documentRegions.get(document).getLanguageAtPosition(position);
const languageId = this.documentRegions.refreshAndGet(document).getLanguageAtPosition(position);
return this.modes[languageId];
}

getAllLanguageModeRangesInDocument(document: TextDocument): LanguageModeRange[] {
const result: LanguageModeRange[] = [];

const documentRegions = this.documentRegions.get(document);
const documentRegions = this.documentRegions.refreshAndGet(document);

documentRegions.getAllLanguageRanges().forEach(lr => {
const mode = this.modes[lr.languageId];
Expand Down
36 changes: 18 additions & 18 deletions server/src/modes/script/javascript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,12 @@ export async function getJavascriptMode(
};
}
const jsDocuments = getLanguageModelCache(10, 60, document => {
const vueDocument = documentRegions.get(document);
const vueDocument = documentRegions.refreshAndGet(document);
return vueDocument.getSingleTypeDocument('script');
});

const firstScriptRegion = getLanguageModelCache(10, 60, document => {
const vueDocument = documentRegions.get(document);
const vueDocument = documentRegions.refreshAndGet(document);
const scriptRegions = vueDocument.getLanguageRangesOfType('script');
return scriptRegions.length > 0 ? scriptRegions[0] : undefined;
});
Expand All @@ -77,7 +77,7 @@ export async function getJavascriptMode(
}
}

const { updateCurrentTextDocument } = serviceHost;
const { updateCurrentVueTextDocument } = serviceHost;
let config: any = {};
let supportedCodeFixCodes: Set<number>;

Expand All @@ -93,7 +93,7 @@ export async function getJavascriptMode(
return;
}

const { service } = updateCurrentTextDocument(doc);
const { service } = updateCurrentVueTextDocument(doc);
const fileFsPath = getFileFsPath(doc.uri);
const info = getComponentInfo(tsModule, service, fileFsPath, config);
if (info) {
Expand All @@ -102,7 +102,7 @@ export async function getJavascriptMode(
},

doValidation(doc: TextDocument): Diagnostic[] {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return [];
}
Expand Down Expand Up @@ -133,7 +133,7 @@ export async function getJavascriptMode(
});
},
doComplete(doc: TextDocument, position: Position): CompletionList {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return { isIncomplete: false, items: [] };
}
Expand Down Expand Up @@ -175,7 +175,7 @@ export async function getJavascriptMode(
};
},
doResolve(doc: TextDocument, item: CompletionItem): CompletionItem {
const { service } = updateCurrentTextDocument(doc);
const { service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return item;
}
Expand Down Expand Up @@ -215,7 +215,7 @@ export async function getJavascriptMode(
return item;
},
doHover(doc: TextDocument, position: Position): Hover {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return { contents: [] };
}
Expand All @@ -237,7 +237,7 @@ export async function getJavascriptMode(
return { contents: [] };
},
doSignatureHelp(doc: TextDocument, position: Position): SignatureHelp | null {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return NULL_SIGNATURE;
}
Expand Down Expand Up @@ -278,7 +278,7 @@ export async function getJavascriptMode(
return ret;
},
findDocumentHighlight(doc: TextDocument, position: Position): DocumentHighlight[] {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return [];
}
Expand All @@ -296,7 +296,7 @@ export async function getJavascriptMode(
return [];
},
findDocumentSymbols(doc: TextDocument): SymbolInformation[] {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return [];
}
Expand Down Expand Up @@ -336,7 +336,7 @@ export async function getJavascriptMode(
return result;
},
findDefinition(doc: TextDocument, position: Position): Definition {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return [];
}
Expand All @@ -362,7 +362,7 @@ export async function getJavascriptMode(
return definitionResults;
},
findReferences(doc: TextDocument, position: Position): Location[] {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
if (!languageServiceIncludesFile(service, doc.uri)) {
return [];
}
Expand Down Expand Up @@ -390,7 +390,7 @@ export async function getJavascriptMode(
return referenceResults;
},
getCodeActions(doc, range, _formatParams, context) {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);
const fileName = getFileFsPath(scriptDoc.uri);
const start = scriptDoc.offsetAt(range.start);
const end = scriptDoc.offsetAt(range.end);
Expand Down Expand Up @@ -427,7 +427,7 @@ export async function getJavascriptMode(
return result;
},
getRefactorEdits(doc: TextDocument, args: RefactorAction) {
const { service } = updateCurrentTextDocument(doc);
const { service } = updateCurrentVueTextDocument(doc);
const response = service.getEditsForRefactor(
args.fileName,
args.formatOptions,
Expand All @@ -444,7 +444,7 @@ export async function getJavascriptMode(
return createApplyCodeActionCommand('', uriMapping);
},
format(doc: TextDocument, range: Range, formatParams: FormattingOptions): TextEdit[] {
const { scriptDoc, service } = updateCurrentTextDocument(doc);
const { scriptDoc, service } = updateCurrentVueTextDocument(doc);

const defaultFormatter =
scriptDoc.languageId === 'javascript'
Expand Down Expand Up @@ -699,7 +699,7 @@ function convertCodeAction(
codeActions: ts.CodeAction[],
regionStart: LanguageModelCache<LanguageRange | undefined>
): TextEdit[] {
const scriptStartOffset = doc.offsetAt(regionStart.get(doc)!.start);
const scriptStartOffset = doc.offsetAt(regionStart.refreshAndGet(doc)!.start);
const textEdits: TextEdit[] = [];
for (const action of codeActions) {
for (const change of action.changes) {
Expand All @@ -708,7 +708,7 @@ function convertCodeAction(
// currently, only import codeAction is available
// change start of doc to start of script region
if (tc.span.start <= scriptStartOffset && tc.span.length === 0) {
const region = regionStart.get(doc);
const region = regionStart.refreshAndGet(doc);
if (region) {
const line = region.start.line;
return {
Expand Down
38 changes: 19 additions & 19 deletions server/src/modes/style/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ function getStyleMode(
documentRegions: LanguageModelCache<VueDocumentRegions>
): LanguageMode {
const embeddedDocuments = getLanguageModelCache(10, 60, document =>
documentRegions.get(document).getSingleLanguageDocument(languageId)
documentRegions.refreshAndGet(document).getSingleLanguageDocument(languageId)
);
const stylesheets = getLanguageModelCache(10, 60, document => languageService.parseStylesheet(document));
let config: any = {};
Expand All @@ -60,14 +60,14 @@ function getStyleMode(
if (languageId === 'postcss') {
return [];
} else {
const embedded = embeddedDocuments.get(document);
return languageService.doValidation(embedded, stylesheets.get(embedded));
const embedded = embeddedDocuments.refreshAndGet(document);
return languageService.doValidation(embedded, stylesheets.refreshAndGet(embedded));
}
},
doComplete(document, position) {
const embedded = embeddedDocuments.get(document);
const embedded = embeddedDocuments.refreshAndGet(document);
const emmetSyntax = languageId === 'postcss' ? 'css' : languageId;
const lsCompletions = languageService.doComplete(embedded, position, stylesheets.get(embedded));
const lsCompletions = languageService.doComplete(embedded, position, stylesheets.refreshAndGet(embedded));
const lsItems = lsCompletions
? _.map(lsCompletions.items, i => {
return {
Expand All @@ -94,36 +94,36 @@ function getStyleMode(
}
},
doHover(document, position) {
const embedded = embeddedDocuments.get(document);
return languageService.doHover(embedded, position, stylesheets.get(embedded)) || NULL_HOVER;
const embedded = embeddedDocuments.refreshAndGet(document);
return languageService.doHover(embedded, position, stylesheets.refreshAndGet(embedded)) || NULL_HOVER;
},
findDocumentHighlight(document, position) {
const embedded = embeddedDocuments.get(document);
return languageService.findDocumentHighlights(embedded, position, stylesheets.get(embedded));
const embedded = embeddedDocuments.refreshAndGet(document);
return languageService.findDocumentHighlights(embedded, position, stylesheets.refreshAndGet(embedded));
},
findDocumentSymbols(document) {
const embedded = embeddedDocuments.get(document);
return languageService.findDocumentSymbols(embedded, stylesheets.get(embedded));
const embedded = embeddedDocuments.refreshAndGet(document);
return languageService.findDocumentSymbols(embedded, stylesheets.refreshAndGet(embedded));
},
findDefinition(document, position) {
const embedded = embeddedDocuments.get(document);
const definition = languageService.findDefinition(embedded, position, stylesheets.get(embedded));
const embedded = embeddedDocuments.refreshAndGet(document);
const definition = languageService.findDefinition(embedded, position, stylesheets.refreshAndGet(embedded));
if (!definition) {
return [];
}
return definition;
},
findReferences(document, position) {
const embedded = embeddedDocuments.get(document);
return languageService.findReferences(embedded, position, stylesheets.get(embedded));
const embedded = embeddedDocuments.refreshAndGet(document);
return languageService.findReferences(embedded, position, stylesheets.refreshAndGet(embedded));
},
findDocumentColors(document) {
const embedded = embeddedDocuments.get(document);
return languageService.findDocumentColors(embedded, stylesheets.get(embedded));
const embedded = embeddedDocuments.refreshAndGet(document);
return languageService.findDocumentColors(embedded, stylesheets.refreshAndGet(embedded));
},
getColorPresentations(document, color, range) {
const embedded = embeddedDocuments.get(document);
return languageService.getColorPresentations(embedded, stylesheets.get(embedded), color, range);
const embedded = embeddedDocuments.refreshAndGet(document);
return languageService.getColorPresentations(embedded, stylesheets.refreshAndGet(embedded), color, range);
},
format(document, currRange, formattingOptions) {
if (config.vetur.format.defaultFormatter[languageId] === 'none') {
Expand Down
8 changes: 4 additions & 4 deletions server/src/modes/style/stylus/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { VLSFormatConfig } from '../../../config';

export function getStylusMode(documentRegions: LanguageModelCache<VueDocumentRegions>): LanguageMode {
const embeddedDocuments = getLanguageModelCache(10, 60, document =>
documentRegions.get(document).getSingleLanguageDocument('stylus')
documentRegions.refreshAndGet(document).getSingleLanguageDocument('stylus')
);
let baseIndentShifted = false;
let config: any = {};
Expand All @@ -30,7 +30,7 @@ export function getStylusMode(documentRegions: LanguageModelCache<VueDocumentReg
onDocumentRemoved() {},
dispose() {},
doComplete(document, position) {
const embedded = embeddedDocuments.get(document);
const embedded = embeddedDocuments.refreshAndGet(document);

const lsCompletions = provideCompletionItems(embedded, position);
const lsItems = _.map(lsCompletions.items, i => {
Expand All @@ -57,11 +57,11 @@ export function getStylusMode(documentRegions: LanguageModelCache<VueDocumentReg
}
},
findDocumentSymbols(document) {
const embedded = embeddedDocuments.get(document);
const embedded = embeddedDocuments.refreshAndGet(document);
return provideDocumentSymbols(embedded);
},
doHover(document, position) {
const embedded = embeddedDocuments.get(document);
const embedded = embeddedDocuments.refreshAndGet(document);
return stylusHover(embedded, position);
},
format(document, range, formatParams) {
Expand Down
Loading