提交 f8934261 编写于 作者: A Alex Dima

Fixes #63822: Keep tokens for empty lines if the language id is not the buffer language id

上级 14ba9f92
...@@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range'; ...@@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range';
import { TokenizationResult2 } from 'vs/editor/common/core/token'; import { TokenizationResult2 } from 'vs/editor/common/core/token';
import { ITextBuffer } from 'vs/editor/common/model'; import { ITextBuffer } from 'vs/editor/common/model';
import { IModelTokensChangedEvent } from 'vs/editor/common/model/textModelEvents'; import { IModelTokensChangedEvent } from 'vs/editor/common/model/textModelEvents';
import { ColorId, FontStyle, IState, ITokenizationSupport, LanguageId, LanguageIdentifier, MetadataConsts, StandardTokenType } from 'vs/editor/common/modes'; import { ColorId, FontStyle, IState, ITokenizationSupport, LanguageId, LanguageIdentifier, MetadataConsts, StandardTokenType, TokenMetadata } from 'vs/editor/common/modes';
import { nullTokenize2 } from 'vs/editor/common/modes/nullMode'; import { nullTokenize2 } from 'vs/editor/common/modes/nullMode';
function getDefaultMetadata(topLevelLanguageId: LanguageId): number { function getDefaultMetadata(topLevelLanguageId: LanguageId): number {
...@@ -262,8 +262,15 @@ export class ModelLinesTokens { ...@@ -262,8 +262,15 @@ export class ModelLinesTokens {
} }
if (lineTextLength === 0) { if (lineTextLength === 0) {
target._lineTokens = EMPTY_LINE_TOKENS; let hasDifferentLanguageId = false;
return; if (tokens && tokens.length > 1) {
hasDifferentLanguageId = (TokenMetadata.getLanguageId(tokens[1]) !== topLevelLanguageId);
}
if (!hasDifferentLanguageId) {
target._lineTokens = EMPTY_LINE_TOKENS;
return;
}
} }
if (!tokens || tokens.length === 0) { if (!tokens || tokens.length === 0) {
......
...@@ -1056,21 +1056,4 @@ suite('Editor Contrib - Line Comment in mixed modes', () => { ...@@ -1056,21 +1056,4 @@ suite('Editor Contrib - Line Comment in mixed modes', () => {
new Selection(2, 8, 2, 8), new Selection(2, 8, 2, 8),
); );
}); });
test.skip('issue #63822: Commenting code in JSX tag body from line 0', () => {
testLineCommentCommand(
[
'<div>',
'',
'</div>',
],
new Selection(2, 1, 2, 1),
[
'<div>',
'{/* */}',
'</div>',
],
new Selection(2, 1, 2, 1),
);
});
}); });
...@@ -390,6 +390,34 @@ suite('TextModelWithTokens regression tests', () => { ...@@ -390,6 +390,34 @@ suite('TextModelWithTokens regression tests', () => {
model.dispose(); model.dispose();
registration.dispose(); registration.dispose();
}); });
test('issue #63822: Wrong embedded language detected for empty lines', () => {
const outerMode = new LanguageIdentifier('outerMode', 3);
const innerMode = new LanguageIdentifier('innerMode', 4);
const tokenizationSupport: ITokenizationSupport = {
getInitialState: () => NULL_STATE,
tokenize: undefined,
tokenize2: (line, state) => {
let tokens = new Uint32Array(2);
tokens[0] = 0;
tokens[1] = (
innerMode.id << MetadataConsts.LANGUAGEID_OFFSET
) >>> 0;
return new TokenizationResult2(tokens, state);
}
};
let registration = TokenizationRegistry.register(outerMode.language, tokenizationSupport);
let model = TextModel.createFromString('A model with one line', undefined, outerMode);
model.forceTokenization(1);
assert.equal(model.getLanguageIdAtPosition(1, 1), innerMode.id);
model.dispose();
registration.dispose();
});
}); });
suite('TextModel.getLineIndentGuide', () => { suite('TextModel.getLineIndentGuide', () => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册