in src/services/cssCompletion.ts [209:272]
private getPropertyProposals(declaration: nodes.Declaration | null, result: CompletionList): CompletionList {
const triggerPropertyValueCompletion = this.isTriggerPropertyValueCompletionEnabled;
const completePropertyWithSemicolon = this.isCompletePropertyWithSemicolonEnabled;
const properties = this.cssDataManager.getProperties();
properties.forEach(entry => {
let range: Range;
let insertText: string;
let retrigger = false;
if (declaration) {
range = this.getCompletionRange(declaration.getProperty());
insertText = entry.name;
if (!isDefined(declaration.colonPosition)) {
insertText += ': ';
retrigger = true;
}
} else {
range = this.getCompletionRange(null);
insertText = entry.name + ': ';
retrigger = true;
}
// Empty .selector { | } case
if (!declaration && completePropertyWithSemicolon) {
insertText += '$0;';
}
// Cases such as .selector { p; } or .selector { p:; }
if (declaration && !declaration.semicolonPosition) {
if (completePropertyWithSemicolon && this.offset >= this.textDocument.offsetAt(range.end)) {
insertText += '$0;';
}
}
const item: CompletionItem = {
label: entry.name,
documentation: languageFacts.getEntryDescription(entry, this.doesSupportMarkdown()),
tags: isDeprecated(entry) ? [CompletionItemTag.Deprecated] : [],
textEdit: TextEdit.replace(range, insertText),
insertTextFormat: InsertTextFormat.Snippet,
kind: CompletionItemKind.Property
};
if (!entry.restrictions) {
retrigger = false;
}
if (triggerPropertyValueCompletion && retrigger) {
item.command = retriggerCommand;
}
const relevance = typeof entry.relevance === 'number' ? Math.min(Math.max(entry.relevance, 0), 99) : 50;
const sortTextSuffix = (255 - relevance).toString(16);
const sortTextPrefix = strings.startsWith(entry.name, '-') ? SortTexts.VendorPrefixed : SortTexts.Normal;
item.sortText = sortTextPrefix + '_' + sortTextSuffix;
result.items.push(item);
});
this.completionParticipants.forEach(participant => {
if (participant.onCssProperty) {
participant.onCssProperty({
propertyName: this.currentWord,
range: this.defaultReplaceRange
});
}
});
return result;
}