DWSx.HelperFunc.pas 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. //
  2. // The graphics rendering platform GLScene http://glscene.org
  3. //
  4. unit DWSx.HelperFunc;
  5. (*
  6. Helper functions for creating class, properties and
  7. method symbols in DelphiWebScript
  8. *)
  9. interface
  10. uses
  11. System.Classes,
  12. System.SysUtils,
  13. dwsSymbols,
  14. dwsCompStrings;
  15. procedure AddForwardDeclaration(ClassName: String; SymbolTable: TSymbolTable);
  16. function AddClassSymbol(SymbolTable: TSymbolTable;
  17. Name, Ancestor: String): TSymbol;
  18. procedure AddPropertyToClass(Name, DataType, ReadAccess, WriteAccess,
  19. IndexDataType: String; IsDefault: Boolean; ClassSym: TClassSymbol;
  20. Table: TSymbolTable);
  21. procedure ValidateExternalObject(ExtObject: TObject; ObjClass: TClass);
  22. // -------------------------------------------------------------------
  23. implementation
  24. // -------------------------------------------------------------------
  25. procedure AddForwardDeclaration(ClassName: String; SymbolTable: TSymbolTable);
  26. var
  27. Sym: TSymbol;
  28. begin
  29. Sym := SymbolTable.FindSymbol(ClassName);
  30. if Assigned(Sym) then
  31. exit;
  32. Sym := TClassSymbol.Create(ClassName);
  33. TClassSymbol(Sym).IsForward := True;
  34. SymbolTable.AddSymbol(Sym);
  35. end;
  36. function AddClassSymbol(SymbolTable: TSymbolTable;
  37. Name, Ancestor: String): TSymbol;
  38. var
  39. ancestorSym: TClassSymbol;
  40. begin
  41. Result := SymbolTable.FindSymbol(Name);
  42. try
  43. if Assigned(Result) then
  44. begin
  45. if Result is TClassSymbol then
  46. begin
  47. if not(TClassSymbol(Result).IsForward) then
  48. begin
  49. exit;
  50. end;
  51. end
  52. else
  53. begin
  54. Result := nil;
  55. exit;
  56. end;
  57. end;
  58. try
  59. if not Assigned(Result) then
  60. Result := TClassSymbol.Create(Name);
  61. ancestorSym := TClassSymbol(SymbolTable.FindSymbol(Ancestor));
  62. if ancestorSym = nil then
  63. raise Exception.CreateFmt(UNT_SuperClassUnknwon, [Ancestor]);
  64. TClassSymbol(Result).InheritFrom(ancestorSym);
  65. except
  66. if not TClassSymbol(Result).IsForward then
  67. FreeAndNil(Result);
  68. raise;
  69. end;
  70. if TClassSymbol(Result).IsForward then
  71. TClassSymbol(Result).IsForward := False
  72. else
  73. SymbolTable.AddSymbol(Result);
  74. finally
  75. if not Assigned(Result) then
  76. raise Exception.CreateFmt('Unable to add %s to the symbol table', [Name]);
  77. end;
  78. end;
  79. procedure AddPropertyToClass(Name, DataType, ReadAccess, WriteAccess,
  80. IndexDataType: String; IsDefault: Boolean; ClassSym: TClassSymbol;
  81. Table: TSymbolTable);
  82. var
  83. Sym: TSymbol;
  84. ParamSym: TParamSymbol;
  85. PropertySym: TPropertySymbol;
  86. begin
  87. if Assigned(ClassSym.Members.FindLocal(Name)) then
  88. exit;
  89. Sym := Table.FindSymbol(DataType);
  90. PropertySym := TPropertySymbol.Create(Name, Sym);
  91. if ReadAccess <> '' then
  92. PropertySym.ReadSym := ClassSym.Members.FindLocal(ReadAccess);
  93. if WriteAccess <> '' then
  94. PropertySym.WriteSym := ClassSym.Members.FindLocal(WriteAccess);
  95. if IndexDataType <> '' then
  96. begin
  97. Sym := Table.FindSymbol(IndexDataType);
  98. ParamSym := TParamSymbol.Create('Index', Sym);
  99. PropertySym.ArrayIndices.AddSymbol(ParamSym);
  100. end;
  101. ClassSym.AddProperty(PropertySym);
  102. if IsDefault then
  103. ClassSym.DefaultProperty := PropertySym;
  104. end;
  105. procedure ValidateExternalObject(ExtObject: TObject; ObjClass: TClass);
  106. var
  107. Valid: Boolean;
  108. begin
  109. if Assigned(ExtObject) then
  110. Valid := (ExtObject is ObjClass)
  111. else
  112. Valid := False;
  113. if not Valid then
  114. raise Exception.Create('Invalid external object.');
  115. end;
  116. end.