Glatzemann 99216ca254 - Fixed some bugs in build system
- Build system optimizations
- Extended ProjectConverter: DX and SharpDX assemblies are now removed from linux projects to prevent errors
- Fixed a bunch of compiler warnings
- Removed DX11MetroShaderGenerator assembly. It is now included in ANX.Framework.Content.Pipeline
- Removed HLSLParser assembly. It is now included in ANX.Framework.Content.Pipeline.
- Removed shader parser from GL3-RenderSystem. It is now included in ANX.Framework.Content.Pipeline.
- Removed RenderSystem dependencies from StockShaderCodeGenerator (sscg) tool
2015-03-15 01:12:04 +01:00

176 lines
3.8 KiB
C#

using System;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license
namespace ANX.Framework.Content.Pipeline.Helpers.HLSLParser
{
public class Method : IShaderElement
{
#region Public
public string StorageClass
{
get;
private set;
}
public string ReturnType
{
get;
private set;
}
public string Name
{
get;
private set;
}
public string Semantic
{
get;
private set;
}
public string Arguments
{
get;
private set;
}
public string Body
{
get;
private set;
}
#endregion
#region Constructor
public Method(ParseTextWalker walker)
{
string text = walker.Text;
if (text.StartsWith("inline"))
{
StorageClass = "inline";
walker.Seek("inline".Length);
text = walker.Text;
}
int indexOfOpenParenthesis = text.IndexOf('(');
int indexOfCloseParenthesis = text.IndexOf(')');
string headerPart = text.Substring(0, indexOfOpenParenthesis).Trim();
headerPart = walker.RemoveUnneededChars(headerPart);
string[] parts = headerPart.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
ReturnType = parts[0].Trim();
Name = parts[1].Trim();
Arguments = text.Substring(indexOfOpenParenthesis + 1,
indexOfCloseParenthesis - indexOfOpenParenthesis - 1);
walker.Seek(indexOfCloseParenthesis + 1);
text = walker.Text;
int indexOfMethodBodyStart = text.IndexOf('{');
if (text.StartsWith(":"))
{
Semantic = text.Substring(1, indexOfMethodBodyStart - 1).Trim();
Semantic = walker.RemoveUnneededChars(Semantic);
}
walker.Seek(indexOfMethodBodyStart + 1);
GetMethodBody(walker);
}
#endregion
#region GetMethodBody
private void GetMethodBody(ParseTextWalker walker)
{
string text = walker.Text;
int numberOfOpenBraces = 0;
int searchBodyEndIndex = 0;
while (searchBodyEndIndex < text.Length)
{
char currentChar = text[searchBodyEndIndex];
if (currentChar == '{')
numberOfOpenBraces++;
else if (currentChar == '}')
numberOfOpenBraces--;
if (numberOfOpenBraces == -1)
break;
searchBodyEndIndex++;
}
Body = text.Substring(0, searchBodyEndIndex - 1);
Body = Body.TrimEnd('\n', '\r', '\t');
walker.Seek(searchBodyEndIndex + 1);
}
#endregion
#region TryParse
public static Method TryParse(ParseTextWalker walker)
{
if(walker.Text.StartsWith("inline ") ||
CheckIfMethodHeaderExists(walker))
{
return new Method(walker);
}
return null;
}
#endregion
#region CheckIfMethodHeaderExists
private static bool CheckIfMethodHeaderExists(ParseTextWalker walker)
{
string text = walker.Text;
int indexOfOpenParenthesis = text.IndexOf('(');
if (indexOfOpenParenthesis == -1)
return false;
string headerPart = text.Substring(0, indexOfOpenParenthesis).Trim();
headerPart = headerPart.Replace("\n", "");
headerPart = headerPart.Replace("\r", "");
headerPart = headerPart.Replace("\t", "");
string[] parts = headerPart.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
return parts.Length == 2;
}
#endregion
#region ToString
public override string ToString()
{
string result = "";
if (String.IsNullOrEmpty(StorageClass) == false)
{
result += StorageClass + " ";
}
result += ReturnType + " " + Name + "(" + Arguments + ")";
if (String.IsNullOrEmpty(Semantic) == false)
{
result += " : " + Semantic;
}
result += "\n{\n\t" + Body + "\n}";
return result;
}
#endregion
}
}