Skip to content

Commit

Permalink
feat: Support negation matches in languageSettings for languageIds (#967
Browse files Browse the repository at this point in the history
)
  • Loading branch information
Jason3S committed Feb 18, 2021
1 parent 0ccc5fe commit cea9114
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
28 changes: 28 additions & 0 deletions packages/cspell-lib/src/Settings/LanguageSettings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ const extraSettings: CSpellUserSettings = {
patterns: [{ name: 'special', pattern: 'special' }],
ignoreRegExpList: ['special'],
},
{
languageId: '!python,!javascript',
ignoreRegExpList: ['no-python-and-javascript'],
},
{
languageId: 'python,javascript',
ignoreRegExpList: ['python-and-javascript'],
},
],
};

Expand Down Expand Up @@ -85,6 +93,26 @@ describe('Validate LanguageSettings', () => {
expect(sPython.allowCompoundWords).toBe(true);
});

test.each`
languageId | ignoreContains | ignoreNotContains
${'python'} | ${['binary', 'special', 'python-and-javascript']} | ${['no-python-and-javascript']}
${'javascript'} | ${['binary', 'python-and-javascript']} | ${['no-python-and-javascript']}
${'plaintext'} | ${['binary', 'no-python-and-javascript']} | ${['python-and-javascript']}
`(
'that ! works for $languageId, contains $ignoreContains, $ignoreNotContains',
({ languageId, ignoreContains, ignoreNotContains }) => {
const settings = {
enabled: true,
allowCompoundWords: false,
languageSettings: [],
...mergeSettings({ languageSettings: defaultLanguageSettings }, extraSettings),
};
const s = calcUserSettingsForLanguage(settings, languageId);
expect(s.ignoreRegExpList).toEqual(expect.arrayContaining(ignoreContains));
expect(s.ignoreRegExpList).not.toEqual(expect.arrayContaining(ignoreNotContains));
}
);

test('merged settings with global', () => {
const merged = mergeSettings(getDefaultSettings(), getGlobalSettings());
const sPHP = calcSettingsForLanguage(merged.languageSettings || [], 'php', 'en');
Expand Down
13 changes: 12 additions & 1 deletion packages/cspell-lib/src/Settings/LanguageSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export function calcSettingsForLanguage(
const allowedLocals = normalizeLocal(local);
return defaultLanguageSettings
.concat(languageSettings)
.filter((s) => !s.languageId || s.languageId === '*' || normalizeLanguageId(s.languageId).has(languageId))
.filter((s) => doesLanguageSettingMatchLanguageId(s, languageId))
.filter((s) => !s.local || s.local === '*' || isLocalInSet(s.local, allowedLocals))
.map((langSetting) => {
const id = normalizeLanguageIdToString(langSetting.local || langSetting.languageId || 'language');
Expand All @@ -68,6 +68,17 @@ export function calcSettingsForLanguage(
);
}

function doesLanguageSettingMatchLanguageId(s: LanguageSetting, languageId: LanguageId): boolean {
const languageSettingsLanguageIds = s.languageId;
if (!languageSettingsLanguageIds || languageSettingsLanguageIds === '*') return true;
const ids = normalizeLanguageId(languageSettingsLanguageIds);
if (ids.has(languageId)) return true;
if (ids.has('!' + languageId)) return false;

const numExcludes = [...ids].filter((id) => id.startsWith('!')).length;
return numExcludes === ids.size;
}

export function calcUserSettingsForLanguage(settings: CSpellUserSettings, languageId: string): CSpellUserSettings {
const { languageSettings = [], language: local = defaultLocal } = settings;
const defaults = {
Expand Down

0 comments on commit cea9114

Please sign in to comment.