bool IsClasslessCode(string rawCode)
{
if (ProcessIfMarkedAsClassless(rawCode))
return true;
//ensure "one statement - one line" rule
string code = new CSharpParser(rawCode).PureCode.Replace("\n", " ").Replace("\r", " ").Replace(";", ";\n");
string line;
StringReader sr = new StringReader(code);
CodeArea area = CodeArea.unknown;
while ((line = sr.ReadLine()) != null)
{
string clearLine = line.Trim();
if (clearLine.Length == 0)
continue;
while (true)
{
switch (area)
{
case CodeArea.unknown:
{
if (IsUsingDirective(clearLine))
{
area = CodeArea.header;
continue;
}
else if (!IsDeclaration(clearLine))
{
area = CodeArea.body;
continue;
}
else
{
area = CodeArea.footer;
continue;
}
}
case CodeArea.header:
{
if (IsUsingDirective(clearLine))
{
header.Append(line);
header.Append(Environment.NewLine);
}
else
{
area = CodeArea.body;
continue;
}
break;
}
case CodeArea.body:
{
if (!IsDeclaration(clearLine))
{
body.Append(line);
body.Append(Environment.NewLine);
}
else
{
area = CodeArea.footer;
continue;
}
break;
}
case CodeArea.footer:
{
footer.Append(line);
footer.Append(Environment.NewLine);
break;
}
}
break;
}
}
if (body.Length != 0)
return true;
else
{
if (footer.Length == 0)
return false;
else
{
//it is either C# or CC# without body
string fotterStr = footer.ToString().TrimStart();
if (fotterStr.StartsWith("namespace") && IsToken(fotterStr, 0, "namespace".Length))
return false;
else
{
foreach (string classToken in new string[] { "class", "enum", "struct" })
{
int classStart = -1;
while ((classStart = fotterStr.IndexOf(classToken, classStart + 1)) != -1)
{
if (IsToken(fotterStr, classStart, classToken.Length))
{
string decorations = fotterStr.Substring(0, classStart);
if (decorations.IndexOfAny(";{}()".ToCharArray()) != -1)
break;
else
return false;
}
}
}
return true;
}
}
}
}
bool IsToken(string text, int start, int length)