Skip to content

Commit

Permalink
Fix errors shown when having #endregion but not matching #region
Browse files Browse the repository at this point in the history
  • Loading branch information
octref committed Apr 19, 2018
1 parent 22ff8ef commit 08a65dc
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 28 deletions.
62 changes: 34 additions & 28 deletions src/services/cssFolding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ function computeFoldingRanges(document: TextDocument): FoldingRange[] {

const ranges: FoldingRange[] = [];

const rangeDelimiterStack: Delimiter[] = [];
const delimiterStack: Delimiter[] = [];

const scanner = getScanner();
scanner.ignoreComment = false;
Expand All @@ -68,16 +68,19 @@ function computeFoldingRanges(document: TextDocument): FoldingRange[] {
case TokenType.CurlyL:
case InterpolationFunction:
{
rangeDelimiterStack.push({ line: getStartLine(token), type: 'brace', isStart: true });
delimiterStack.push({ line: getStartLine(token), type: 'brace', isStart: true });
break;
}
case TokenType.CurlyR: {
if (rangeDelimiterStack.length !== 0) {
const { line: startLine, type } = popPreviousStartDelimiterOfType(rangeDelimiterStack, 'brace');
if (delimiterStack.length !== 0) {
const prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'brace');
if (!prevDelimiter) {
break;
}

let endLine = getEndLine(token);

if (type === 'brace') {
if (prevDelimiter.type === 'brace') {
/**
* Other than the case when curly brace is not on a new line by itself, for example
* .foo {
Expand All @@ -88,9 +91,9 @@ function computeFoldingRanges(document: TextDocument): FoldingRange[] {
endLine--;
}

if (startLine !== endLine) {
if (prevDelimiter.line !== endLine) {
ranges.push({
startLine,
startLine: prevDelimiter.line,
endLine,
kind: undefined
});
Expand All @@ -104,40 +107,43 @@ function computeFoldingRanges(document: TextDocument): FoldingRange[] {
* All comments are marked as `Comment`
*/
case TokenType.Comment: {
const commentRegionMarkerToRangeDelimiter = (marker): Delimiter => {
const commentRegionMarkerToDelimiter = (marker): Delimiter => {
if (marker === '#region') {
return { line: getStartLine(token), type: 'comment', isStart: true };
} else {
return { line: getEndLine(token), type: 'comment', isStart: false };
}
};

let rangeDelimiter: Delimiter;

// /* */ comment region folding
const matches = token.text.match(/^\s*\/\*\s*(#region|#endregion)\b\s*(.*?)\s*\*\//);
if (matches) {
rangeDelimiter = commentRegionMarkerToRangeDelimiter(matches[1]);
} else if (document.languageId === 'scss' || document.languageId === 'less') {
const matches = token.text.match(/^\s*\/\/\s*(#region|#endregion)\b\s*(.*?)\s*/);
const getCurrDelimiter = (token: IToken): Delimiter => {
const matches = token.text.match(/^\s*\/\*\s*(#region|#endregion)\b\s*(.*?)\s*\*\//);
if (matches) {
rangeDelimiter = commentRegionMarkerToRangeDelimiter(matches[1]);
return commentRegionMarkerToDelimiter(matches[1]);
} else if (document.languageId === 'scss' || document.languageId === 'less') {
const matches = token.text.match(/^\s*\/\/\s*(#region|#endregion)\b\s*(.*?)\s*/);
if (matches) {
return commentRegionMarkerToDelimiter(matches[1]);
}
}
}

return null;
};

const currDelimiter = getCurrDelimiter(token);

// /* */ comment region folding
// All #region and #endregion cases
if (rangeDelimiter) {
if (rangeDelimiter.isStart) {
rangeDelimiterStack.push(rangeDelimiter);
if (currDelimiter) {
if (currDelimiter.isStart) {
delimiterStack.push(currDelimiter);
} else {
const { line: startLine, type } = popPreviousStartDelimiterOfType(rangeDelimiterStack, 'comment');
const prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'comment');

const endLine = rangeDelimiter.line;
if (type === 'comment') {
if (startLine !== endLine) {
if (prevDelimiter.type === 'comment') {
if (prevDelimiter.line !== currDelimiter.line) {
ranges.push({
startLine,
endLine,
startLine: prevDelimiter.line,
endLine: currDelimiter.line,
kind: 'region'
});
}
Expand All @@ -163,7 +169,7 @@ function computeFoldingRanges(document: TextDocument): FoldingRange[] {
return ranges;
}

function popPreviousStartDelimiterOfType(stack: Delimiter[], type: DelimiterType): Delimiter {
function popPrevStartDelimiterOfType(stack: Delimiter[], type: DelimiterType): Delimiter | null {
if (stack.length === 0) {
return null;
}
Expand Down
19 changes: 19 additions & 0 deletions src/test/css/folding.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,25 @@ suite('CSS Folding - Partial', () => {
];
assertRanges(input, [r(1, 4), r(2, 3)]);
});

test('Without opening curly brace should not throw error', () => {
const input = [
/*0*/'.foo',
/*1*/' color: blue;',
/*2*/'}}'
];
assertRanges(input, []);
});

// test('Without opening #region should not throw error', () => {
// const input = [
// /*0*/'.foo',
// /*1*/' color: blue;',
// /*2*/'}',
// /*3*/'/* #endregion */'
// ];
// assertRanges(input, []);
// });
});

suite('CSS Folding - Comments', () => {
Expand Down

0 comments on commit 08a65dc

Please sign in to comment.