Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

123 rader
4.7 KiB

  1. unit uengShaderFileHelper;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. uengShaderPart, uengShaderFileParser;
  7. function IsValidIdentifier(const aIdent: String): Boolean;
  8. function CheckEndToken(const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
  9. function ExtractSearchResult(const aSender: TengShaderPart; const aIdent: String; const aList: TengShaderPartList; aLine: Integer = -1; aCol: Integer = -1; aFilename: String = ''): TengShaderPart;
  10. type
  11. TkvpSearchResults = class(TengSearchResults)
  12. private
  13. fName: String;
  14. protected
  15. function CheckObj(const aPart: TengShaderPart; var aContinue: Boolean): Boolean; override;
  16. public
  17. constructor Create(const aName: String; const aSearchDefines, aSearchProperties: Boolean);
  18. end;
  19. implementation
  20. uses
  21. sysutils,
  22. uengShaderFileConstants, uengShaderFileTypes, uengShaderPartKeyValuePair;
  23. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  24. function IsValidIdentifier(const aIdent: String): Boolean;
  25. var
  26. i, len: Integer;
  27. begin
  28. len := Length(aIdent);
  29. result := false;
  30. for i := 1 to len do
  31. if not (aIdent[i] in VALID_IDENT_CHARS) then
  32. exit;
  33. result := true;
  34. end;
  35. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. function CheckEndToken(const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
  37. var
  38. oldLine, oldCol: Integer;
  39. param: TengTokenParameterList;
  40. begin
  41. param := TengTokenParameterList.Create('');
  42. try
  43. oldLine := aArgs.Line;
  44. oldCol := aArgs.Col;
  45. if not aArgs.ExtractToken(aShaderPart, param) then
  46. EengUnexpectedToken.Create(TOKEN_NONE, TOKEN_END, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
  47. if (param[0].Name <> TOKEN_END) then
  48. EengUnexpectedToken.Create(param[0].Name, TOKEN_END, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
  49. if (param.Count <> 1) then
  50. EengInvalidParamterCount.Create(TOKEN_END, 1, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
  51. result := '';
  52. finally
  53. FreeAndNil(param);
  54. end;
  55. end;
  56. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. function ExtractSearchResult(const aSender: TengShaderPart; const aIdent: String; const aList: TengShaderPartList;
  58. aLine: Integer; aCol: Integer; aFilename: String): TengShaderPart;
  59. var
  60. s: String;
  61. i: Integer;
  62. begin
  63. result := nil;
  64. if Assigned(aSender) then begin
  65. if (aLine < 0) then
  66. aLine := aSender.Line;
  67. if (aCol < 0) then
  68. aCol := aSender.Col;
  69. if (aFilename = '') then
  70. aFilename := aSender.Filename;
  71. end;
  72. if (aList.Count <= 0) then
  73. raise EengUnknownIdentifier.Create(aIdent, aLine, aCol, aFilename, aSender);
  74. result := aList[0];
  75. if (aList.Count > 1) and Assigned(aSender) then begin
  76. s := Format('use of duplicate identifier: %s (%s %d:%d)', [aIdent, aList[0].Filename, aList[0].Line + 1, aList[0].Col]) + sLineBreak +
  77. 'previously declared here:' + sLineBreak;
  78. i := 1;
  79. while (i < aList.Count) do begin
  80. s := s + Format(' %s %d:%d', [aList[i].Filename, aList[i].Line + 1, aList[i].Col]) + sLineBreak;
  81. inc(i);
  82. end;
  83. aSender.LogMsg(llWarning, s);
  84. end;
  85. end;
  86. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. //TkvpSearchResults/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. function TkvpSearchResults.CheckObj(const aPart: TengShaderPart; var aContinue: Boolean): Boolean;
  90. begin
  91. result := inherited CheckObj(aPart, aContinue);
  92. if result then
  93. result := ((aPart as TengShaderPartKeyValuePair).Name = fName);
  94. end;
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. constructor TkvpSearchResults.Create(const aName: String; const aSearchDefines, aSearchProperties: Boolean);
  97. begin
  98. if aSearchDefines and aSearchProperties then
  99. inherited Create([TengShaderPartStatic, TengShaderPartProperty])
  100. else if aSearchDefines then
  101. inherited Create([TengShaderPartStatic])
  102. else if aSearchProperties then
  103. inherited Create([TengShaderPartProperty])
  104. else
  105. inherited Create([]);
  106. fName := aName;
  107. end;
  108. end.