Clean up indentation code
This commit is contained in:
parent
241dc1e8c1
commit
8639e4c287
|
@ -35,7 +35,9 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
int indentToMostRecent(IdType item) const
|
int indentToMostRecent(IdType item) const
|
||||||
{
|
{
|
||||||
size_t i = index;
|
if (index == 0)
|
||||||
|
return -1;
|
||||||
|
size_t i = index - 1;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (arr[i] == item)
|
if (arr[i] == item)
|
||||||
|
@ -54,7 +56,7 @@ struct IndentStack
|
||||||
int tempIndentCount = 0;
|
int tempIndentCount = 0;
|
||||||
for (size_t i = index; i > 0; i--)
|
for (size_t i = index; i > 0; i--)
|
||||||
{
|
{
|
||||||
if (!isWrapIndent(arr[i]) && arr[i] != tok!"]")
|
if (!isWrapIndent(arr[i - 1]) && arr[i - 1] != tok!"]")
|
||||||
break;
|
break;
|
||||||
tempIndentCount++;
|
tempIndentCount++;
|
||||||
}
|
}
|
||||||
|
@ -66,8 +68,8 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
void push(IdType item) pure nothrow
|
void push(IdType item) pure nothrow
|
||||||
{
|
{
|
||||||
index = index == 255 ? index : index + 1;
|
|
||||||
arr[index] = item;
|
arr[index] = item;
|
||||||
|
index = index + 1 == arr.length ? index : index + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -83,7 +85,7 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
void popWrapIndents() pure nothrow @safe @nogc
|
void popWrapIndents() pure nothrow @safe @nogc
|
||||||
{
|
{
|
||||||
while (index > 0 && isWrapIndent(arr[index]))
|
while (index > 0 && isWrapIndent(arr[index - 1]))
|
||||||
index--;
|
index--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +94,7 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
void popTempIndents() pure nothrow @safe @nogc
|
void popTempIndents() pure nothrow @safe @nogc
|
||||||
{
|
{
|
||||||
while (index > 0 && isTempIndent(arr[index]))
|
while (index > 0 && isTempIndent(arr[index - 1]))
|
||||||
index--;
|
index--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +103,7 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
bool topIs(IdType type) const pure nothrow @safe @nogc
|
bool topIs(IdType type) const pure nothrow @safe @nogc
|
||||||
{
|
{
|
||||||
return index > 0 && arr[index] == type;
|
return index > 0 && index <= arr.length && arr[index - 1] == type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -109,7 +111,7 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
bool topIsTemp()
|
bool topIsTemp()
|
||||||
{
|
{
|
||||||
return index > 0 && index < arr.length && isTempIndent(arr[index]);
|
return index > 0 && index <= arr.length && isTempIndent(arr[index - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,7 +119,7 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
bool topIsWrap()
|
bool topIsWrap()
|
||||||
{
|
{
|
||||||
return index > 0 && index < arr.length && isWrapIndent(arr[index]);
|
return index > 0 && index <= arr.length && isWrapIndent(arr[index - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -126,9 +128,9 @@ struct IndentStack
|
||||||
*/
|
*/
|
||||||
bool topIsOneOf(IdType[] types...) const pure nothrow @safe @nogc
|
bool topIsOneOf(IdType[] types...) const pure nothrow @safe @nogc
|
||||||
{
|
{
|
||||||
if (index <= 0)
|
if (index == 0)
|
||||||
return false;
|
return false;
|
||||||
immutable topType = arr[index];
|
immutable topType = arr[index - 1];
|
||||||
foreach (t; types)
|
foreach (t; types)
|
||||||
if (t == topType)
|
if (t == topType)
|
||||||
return true;
|
return true;
|
||||||
|
@ -137,15 +139,15 @@ struct IndentStack
|
||||||
|
|
||||||
IdType top() const pure nothrow @property @safe @nogc
|
IdType top() const pure nothrow @property @safe @nogc
|
||||||
{
|
{
|
||||||
return arr[index];
|
return arr[index - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
int indentLevel() const pure nothrow @safe @nogc @property
|
int indentLevel() const pure nothrow @property @safe @nogc
|
||||||
{
|
{
|
||||||
return indentSize();
|
return indentSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
int length() const pure nothrow @property
|
int length() const pure nothrow @property @safe @nogc
|
||||||
{
|
{
|
||||||
return cast(int) index;
|
return cast(int) index;
|
||||||
}
|
}
|
||||||
|
@ -156,15 +158,15 @@ private:
|
||||||
|
|
||||||
IdType[256] arr;
|
IdType[256] arr;
|
||||||
|
|
||||||
int indentSize(size_t k = size_t.max) const pure nothrow @safe @nogc
|
int indentSize(const size_t k = size_t.max) const pure nothrow @safe @nogc
|
||||||
{
|
{
|
||||||
if (index == 0)
|
if (index == 0 || k == 0)
|
||||||
return 0;
|
return 0;
|
||||||
immutable size_t j = k == size_t.max ? index : k - 1;
|
immutable size_t j = k == size_t.max ? index : k;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
foreach (i; 1 .. j + 1)
|
foreach (i; 0 .. j)
|
||||||
{
|
{
|
||||||
if (i + 1 <= index)
|
if (i + 1 < index)
|
||||||
{
|
{
|
||||||
if (arr[i] == tok!"]")
|
if (arr[i] == tok!"]")
|
||||||
continue;
|
continue;
|
||||||
|
@ -179,3 +181,18 @@ private:
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
IndentStack stack;
|
||||||
|
stack.push(tok!"{");
|
||||||
|
assert(stack.length == 1);
|
||||||
|
assert(stack.indentLevel == 1);
|
||||||
|
stack.pop();
|
||||||
|
assert(stack.length == 0);
|
||||||
|
assert(stack.indentLevel == 0);
|
||||||
|
stack.push(tok!"if");
|
||||||
|
assert(stack.topIsTemp());
|
||||||
|
stack.popTempIndents();
|
||||||
|
assert(stack.length == 0);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue