瀏覽代碼

* added project for unit tests

master
Bergmann89 11 年之前
父節點
當前提交
ffea14a852
共有 19 個文件被更改,包括 374 次插入 和 19 次删除
  1. +5
    -0
      .gitignore
  2. +210
    -0
      tests/ShaderFileTests.lpi
  3. +15
    -0
      tests/ShaderFileTests.lpr
  4. +8
    -0
      tests/code_IfElseElifEnd.shdr
  5. +9
    -0
      tests/code_InlineIf.shdr
  6. +1
    -0
      tests/result_IfElseElifEnd_0.shdr
  7. +1
    -0
      tests/result_IfElseElifEnd_1.shdr
  8. +1
    -0
      tests/result_IfElseElifEnd_2.shdr
  9. +4
    -0
      tests/result_InlineIf_0.shdr
  10. +4
    -0
      tests/result_InlineIf_1.shdr
  11. +72
    -0
      tests/uShaderFileTestCase.pas
  12. +8
    -1
      uengShaderFile.pas
  13. +17
    -7
      uengShaderFileHelper.pas
  14. +1
    -1
      uengShaderFileScope.pas
  15. +8
    -2
      uengShaderGeneratorArgs.pas
  16. +1
    -1
      uengShaderPartCall.pas
  17. +4
    -3
      uengShaderPartClass.pas
  18. +3
    -2
      uengShaderPartIf.pas
  19. +2
    -2
      uengShaderPartProc.pas

+ 5
- 0
.gitignore 查看文件

@@ -0,0 +1,5 @@
*/lib/
*.lps
*.exe
*.res
*.ico

+ 210
- 0
tests/ShaderFileTests.lpi 查看文件

@@ -0,0 +1,210 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="ShaderFileTests"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="3">
<Item1>
<PackageName Value="FPCUnitTestRunner"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
<Item3>
<PackageName Value="FCL"/>
</Item3>
</RequiredPackages>
<Units Count="27">
<Unit0>
<Filename Value="ShaderFileTests.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ShaderFileTests"/>
</Unit0>
<Unit1>
<Filename Value="uShaderFileTestCase.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uShaderFileTestCase"/>
</Unit1>
<Unit2>
<Filename Value="..\uengShaderPart.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPart"/>
</Unit2>
<Unit3>
<Filename Value="..\uengShaderFileTypes.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderFileTypes"/>
</Unit3>
<Unit4>
<Filename Value="..\uengShaderFile.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderFile"/>
</Unit4>
<Unit5>
<Filename Value="..\uengShaderGenerator.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderGenerator"/>
</Unit5>
<Unit6>
<Filename Value="..\uengShaderFileConstants.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderFileConstants"/>
</Unit6>
<Unit7>
<Filename Value="..\uengShaderFileExpression.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderFileExpression"/>
</Unit7>
<Unit8>
<Filename Value="..\uengShaderFileHelper.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderFileHelper"/>
</Unit8>
<Unit9>
<Filename Value="..\uengShaderFileParser.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderFileParser"/>
</Unit9>
<Unit10>
<Filename Value="..\uengShaderFileScope.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderFileScope"/>
</Unit10>
<Unit11>
<Filename Value="..\uengShaderGeneratorArgs.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderGeneratorArgs"/>
</Unit11>
<Unit12>
<Filename Value="..\uengShaderPartCall.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartCall"/>
</Unit12>
<Unit13>
<Filename Value="..\uengShaderPartClass.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartClass"/>
</Unit13>
<Unit14>
<Filename Value="..\uengShaderPartCntr.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartCntr"/>
</Unit14>
<Unit15>
<Filename Value="..\uengShaderPartComment.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartComment"/>
</Unit15>
<Unit16>
<Filename Value="..\uengShaderPartEcho.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartEcho"/>
</Unit16>
<Unit17>
<Filename Value="..\uengShaderPartIf.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartIf"/>
</Unit17>
<Unit18>
<Filename Value="..\uengShaderPartInclude.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartInclude"/>
</Unit18>
<Unit19>
<Filename Value="..\uengShaderPartKeyValuePair.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartKeyValuePair"/>
</Unit19>
<Unit20>
<Filename Value="..\uengShaderPartMessage.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartMessage"/>
</Unit20>
<Unit21>
<Filename Value="..\uengShaderPartMeta.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartMeta"/>
</Unit21>
<Unit22>
<Filename Value="..\uengShaderPartParameter.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartParameter"/>
</Unit22>
<Unit23>
<Filename Value="..\uengShaderPartProc.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartProc"/>
</Unit23>
<Unit24>
<Filename Value="..\uengShaderPartScope.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartScope"/>
</Unit24>
<Unit25>
<Filename Value="..\uengShaderPartText.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderPartText"/>
</Unit25>
<Unit26>
<Filename Value="..\uengShaderCodePart.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uengShaderCodePart"/>
</Unit26>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="ShaderFileTests"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir);.."/>
<OtherUnitFiles Value="..;..\..\Utils"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Other>
<CompilerMessages>
<IgnoredMessages idx5024="True"/>
</CompilerMessages>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

+ 15
- 0
tests/ShaderFileTests.lpr 查看文件

@@ -0,0 +1,15 @@
program ShaderFileTests;

{$mode objfpc}{$H+}

uses
Interfaces, Forms, GuiTestRunner, uShaderFileTestCase;

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TGuiTestRunner, TestRunner);
Application.Run;
end.


+ 8
- 0
tests/code_IfElseElifEnd.shdr 查看文件

@@ -0,0 +1,8 @@
{$PROPERTY TestProp '0'}
{$IF TestProp = '0'}
int i = 0;
{$ELIF TestProp = '1'}
int i = 1;
{$ELSE}
int i = 2;
{$END}

+ 9
- 0
tests/code_InlineIf.shdr 查看文件

@@ -0,0 +1,9 @@
{$PROPERTY TestProp '0'}
some code here = {$IF TestProp = '0'}this code{$ELSE}that code{$END};
some code here = {$IF TestProp = '0'}
this code *
more code
{$ELSE}
that code *
more code
{$END};

+ 1
- 0
tests/result_IfElseElifEnd_0.shdr 查看文件

@@ -0,0 +1 @@
int i = 0;

+ 1
- 0
tests/result_IfElseElifEnd_1.shdr 查看文件

@@ -0,0 +1 @@
int i = 1;

+ 1
- 0
tests/result_IfElseElifEnd_2.shdr 查看文件

@@ -0,0 +1 @@
int i = 2;

+ 4
- 0
tests/result_InlineIf_0.shdr 查看文件

@@ -0,0 +1,4 @@
some code here = this code;
some code here =
this code *
more code;

+ 4
- 0
tests/result_InlineIf_1.shdr 查看文件

@@ -0,0 +1,4 @@
some code here = that code;
some code here =
that code *
more code;

+ 72
- 0
tests/uShaderFileTestCase.pas 查看文件

@@ -0,0 +1,72 @@
unit uShaderFileTestCase;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, fpcunit, testregistry,
uengShaderFile, uengShaderGenerator, uengShaderFileTypes;

type
TShaderFileTestCase = class(TTestCase)
private
procedure DoTest(const aCode: String; const aValue: Integer; const aResult: String);
published
procedure IfElseElifEnd;
procedure InlineIf;
end;

implementation

uses
Forms;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TShaderFileTestCase///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TShaderFileTestCase.DoTest(const aCode: String; const aValue: Integer; const aResult: String);
var
shdr: TengShaderFile;
gen: TengShaderGenerator;
code: TengShaderCode;
sl: TStringList;
begin
shdr := TengShaderFile.Create;
code := TengShaderCode.Create;
sl := TStringList.Create;
try
shdr.LoadFromFile(ExpandFileName(aCode));
gen := shdr.Generator[''];
if (gen.PropertyCount > 0) then
gen.PropertyByIndex[0] := aValue;
gen.GenerateCode(code);
sl.LoadFromFile(ExpandFileName(aResult));
AssertEquals(sl.Text, code.Text);
finally
FreeAndNil(sl);
FreeAndNil(code);
FreeAndNil(shdr);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TShaderFileTestCase.IfElseElifEnd;
begin
DoTest('code_IfElseElifEnd.shdr', 0, 'result_IfElseElifEnd_0.shdr');
DoTest('code_IfElseElifEnd.shdr', 1, 'result_IfElseElifEnd_1.shdr');
DoTest('code_IfElseElifEnd.shdr', 2, 'result_IfElseElifEnd_2.shdr');
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TShaderFileTestCase.InlineIf;
begin
DoTest('code_InlineIf.shdr', 0, 'result_InlineIf_0.shdr');
DoTest('code_InlineIf.shdr', 1, 'result_InlineIf_1.shdr');
end;

initialization
RegisterTest(TShaderFileTestCase);

end.


+ 8
- 1
uengShaderFile.pas 查看文件

@@ -60,7 +60,8 @@ type
property OnLog: TengShaderFileLogEvent read fOnLog write fOnLog; property OnLog: TengShaderFileLogEvent read fOnLog write fOnLog;


procedure Clear; override; procedure Clear; override;
constructor Create(const aParent: TengShaderPart); override;
constructor Create; overload;
constructor Create(const aParent: TengShaderPart); override; overload;
destructor Destroy; override; destructor Destroy; override;
end; end;


@@ -309,6 +310,12 @@ begin
fClasses.Clear; fClasses.Clear;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TengShaderFile.Create;
begin
Create(nil);
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TengShaderFile.Create(const aParent: TengShaderPart); constructor TengShaderFile.Create(const aParent: TengShaderPart);
begin begin


+ 17
- 7
uengShaderFileHelper.pas 查看文件

@@ -16,7 +16,7 @@ type
TInfoFlags = set of TInfoFlag; TInfoFlags = set of TInfoFlag;


function IsValidIdentifier(const aIdent: String): Boolean; function IsValidIdentifier(const aIdent: String): Boolean;
function CheckEndToken(const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
function CheckEndToken(const aToken: String; const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
function CheckType(const aShaderPart: TengShaderPart; const aTypes: array of CengShaderPart): Boolean; function CheckType(const aShaderPart: TengShaderPart; const aTypes: array of CengShaderPart): Boolean;
function ExtractSearchResult( function ExtractSearchResult(
const aSender: TengShaderPart; const aSender: TengShaderPart;
@@ -97,7 +97,8 @@ implementation


uses uses
sysutils, sysutils,
uengShaderFileConstants, uengShaderFileTypes, uengShaderPartKeyValuePair, uengShaderPartProc, uengShaderPartIf;
uengShaderFileConstants, uengShaderFileTypes, uengShaderPartKeyValuePair, uengShaderPartProc,
uengShaderPartIf, uengShaderPartClass;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function IsValidIdentifier(const aIdent: String): Boolean; function IsValidIdentifier(const aIdent: String): Boolean;
@@ -113,15 +114,17 @@ begin
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CheckEndToken(const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
function CheckEndToken(const aToken: String; const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
var var
oldLine, oldCol: Integer; oldLine, oldCol: Integer;
param: TengTokenParameterList; param: TengTokenParameterList;
begin begin
oldLine := aArgs.Line;
oldCol := aArgs.Col;
if (aToken <> TOKEN_END) then
raise EengUnexpectedToken.Create(aToken, TOKEN_END, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
param := TengTokenParameterList.Create(''); param := TengTokenParameterList.Create('');
try try
oldLine := aArgs.Line;
oldCol := aArgs.Col;
if not aArgs.ExtractToken(aShaderPart, param) then if not aArgs.ExtractToken(aShaderPart, param) then
EengUnexpectedToken.Create(TOKEN_NONE, TOKEN_END, oldLine, oldCol, aShaderPart.Filename, aShaderPart); EengUnexpectedToken.Create(TOKEN_NONE, TOKEN_END, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
if (param[0].Name <> TOKEN_END) then if (param[0].Name <> TOKEN_END) then
@@ -227,6 +230,7 @@ var


var var
p: TengShaderPart; p: TengShaderPart;
c: TengShaderPartClass;
nextArgs: TArgs; nextArgs: TArgs;
begin begin
if not Assigned(aPart) then if not Assigned(aPart) then
@@ -245,6 +249,12 @@ begin
if VisitParent then if VisitParent then
Visit(aPart.Parent, aPart, @nextArgs); Visit(aPart.Parent, aPart, @nextArgs);


// visit inherited
if (sfSearchInherited in args.Flags) and (aPart is TengShaderPartClass) then begin
for c in (aPart as TengShaderPartClass).InheritedClasses do
Visit(c, aPart, @nextArgs);
end;

// visit children // visit children
if (sfSearchChildren in args.Flags) then begin if (sfSearchChildren in args.Flags) then begin
if (aPart is TengShaderPartIf) then with (aPart as TengShaderPartIf) do begin if (aPart is TengShaderPartIf) then with (aPart as TengShaderPartIf) do begin
@@ -253,7 +263,7 @@ begin
then p := IfPart then p := IfPart
else p := ElsePart; else p := ElsePart;
if Assigned(p) then if Assigned(p) then
Visit(p, aPart, @args);
Visit(p, aPart, @nextArgs);
exit; exit;
end else if (sfIgnoreIf in args.Flags) then end else if (sfIgnoreIf in args.Flags) then
exit; exit;
@@ -263,7 +273,7 @@ begin
if Check(p) then if Check(p) then
fResults.Add(p); fResults.Add(p);
if VisitChild(p) then if VisitChild(p) then
Visit(p, aPart, @args);
Visit(p, aPart, @nextArgs);
end; end;
end; end;
end; end;


+ 1
- 1
uengShaderFileScope.pas 查看文件

@@ -9,7 +9,7 @@ interface
uses uses
Classes, SysUtils, Classes, SysUtils,


uengShaderFilePart;
uengShaderPart;


type type
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


+ 8
- 2
uengShaderGeneratorArgs.pas 查看文件

@@ -201,7 +201,8 @@ type
gfToken, // current line has a token in it gfToken, // current line has a token in it
gfTokenOnly, // current line has only a token (or whitespaces) in it gfTokenOnly, // current line has only a token (or whitespaces) in it
gfPrevIsEmpty, // previouse line was empty (or whitespaces only) gfPrevIsEmpty, // previouse line was empty (or whitespaces only)
gfCodeIsEmpty // nothing has added to code
gfCodeIsEmpty, // nothing has added to code
gfAddToPrev // add current line to previouse line
); );
TGenFlags = set of TGenFlag; TGenFlags = set of TGenFlag;


@@ -291,12 +292,15 @@ var
Include(f, gfPrevIsEmpty); Include(f, gfPrevIsEmpty);
end; end;
end else begin end else begin
aCode.Add(line);
if (gfAddToPrev in f) and not (gfCodeIsEmpty in f)
then aCode[aCode.Count-1] := aCode[aCode.Count-1] + TrimLeft(line)
else aCode.Add(line);
Exclude(f, gfPrevIsEmpty); Exclude(f, gfPrevIsEmpty);
Exclude(f, gfCodeIsEmpty); Exclude(f, gfCodeIsEmpty);
end; end;
Exclude(f, gfToken); Exclude(f, gfToken);
Exclude(f, gfTokenOnly); Exclude(f, gfTokenOnly);
Exclude(f, gfAddToPrev);
line := ''; line := '';
end; end;


@@ -313,6 +317,8 @@ var


gtBlockEnd: begin gtBlockEnd: begin
IndentBlock(FirstLineIndex, aIndent); IndentBlock(FirstLineIndex, aIndent);
if (Trim(line) = '') and not (gfPrevIsEmpty in f) then
include(f, gfAddToPrev);
exit; exit;
end; end;




+ 1
- 1
uengShaderPartCall.pas 查看文件

@@ -198,7 +198,7 @@ procedure TengShaderPartInherited.GenerateCodeIntern(const aArgs: TengShaderGene
if (walker.Name = '') then if (walker.Name = '') then
walker.Name := ParentProc.Name; walker.Name := ParentProc.Name;
walker.Owner := ParentProc; walker.Owner := ParentProc;
walker.SearchFlags := [sfEvaluateIf, sfIgnoreOwner, sfSearchChildrenLazy, sfSearchInherited, sfSearchParents];
walker.SearchFlags := [sfEvaluateIf, sfIgnoreOwner, sfSearchChildrenLazy, sfSearchInherited];
walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderPartClass); walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderPartClass);
walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartClass); walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartClass);
walker.Run(ParentProc); walker.Run(ParentProc);


+ 4
- 3
uengShaderPartClass.pas 查看文件

@@ -38,8 +38,9 @@ type


{ General } { General }
public public
property Name: String read fName;
property Extends: TStrings read GetExtends;
property Name: String read fName;
property Extends: TStrings read GetExtends;
property InheritedClasses: TengShaderPartClassList read fInherited;


constructor Create(const aParent: TengShaderPart); override; constructor Create(const aParent: TengShaderPart); override;
destructor Destroy; override; destructor Destroy; override;
@@ -154,7 +155,7 @@ begin
end; end;
UpdateInherited; UpdateInherited;
result := inherited ParseIntern(aArgs, aParams); result := inherited ParseIntern(aArgs, aParams);
result := CheckEndToken(aArgs, self);
result := CheckEndToken(result, aArgs, self);
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


+ 3
- 2
uengShaderPartIf.pas 查看文件

@@ -101,6 +101,7 @@ begin
break; break;
end; end;
end; end;
result := aToken;
if Assigned(fElsePart) then if Assigned(fElsePart) then
result := fElsePart.ParseText(aArgs); result := fElsePart.ParseText(aArgs);
result := HandeEndToken(result, aArgs); result := HandeEndToken(result, aArgs);
@@ -109,7 +110,7 @@ end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TengShaderPartIf.HandeEndToken(const aToken: String; const aArgs: TengParseArgs): String; function TengShaderPartIf.HandeEndToken(const aToken: String; const aArgs: TengParseArgs): String;
begin begin
result := CheckEndToken(aArgs, self);
result := CheckEndToken(aToken, aArgs, self);
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -185,7 +186,7 @@ function TengShaderPartElIf.HandeEndToken(const aToken: String; const aArgs: Ten
begin begin
result := aToken; result := aToken;
if (result <> TOKEN_END) then if (result <> TOKEN_END) then
raise EengInvalidToken.Create(ClassName, result, aArgs.Line, aArgs.Col, Filename, self);
raise EengUnexpectedToken.Create(aToken, TOKEN_END, aArgs.Col, aArgs.Line, Filename, self);
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


+ 2
- 2
uengShaderPartProc.pas 查看文件

@@ -179,8 +179,8 @@ begin
end; end;
if (state <> pasType) then if (state <> pasType) then
raise EengInvalidParamterCount.Create('invalid parameter count in ' + GetTokenName + '(expected multiple of 2)', self); raise EengInvalidParamterCount.Create('invalid parameter count in ' + GetTokenName + '(expected multiple of 2)', self);
inherited ParseIntern(aArgs, aParams);
result := CheckEndToken(aArgs, self);
result := inherited ParseIntern(aArgs, aParams);
result := CheckEndToken(result, aArgs, self);
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Loading…
取消
儲存