Parser's "CaseSensitive" implementation fix.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1963 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2011-09-16 00:56:48 +00:00
parent 70977e292b
commit 8b1e3a960e
4 changed files with 133 additions and 80 deletions

View File

@ -49,6 +49,7 @@ type
const
BindingStyleNames : array[TBindingStyle] of string = ( 'Document', 'RPC', 'Unknown' );
NAME_KINDS_DEFAULT = [elkDeclaredName, elkName];
type
TArrayStyle = ( asScoped, asEmbeded );
@ -104,6 +105,7 @@ type
FBindingList : TObjectList;
FProperties : TPropertyHolder;
FCaseSensitive : Boolean;
FDefaultSearchNameKinds: TElementNameKinds;
private
function GetBinding(AIndex : Integer): TwstBinding;
function GetBindingCount: Integer;
@ -138,8 +140,12 @@ type
function FindElementInModule(
const AName: String;
AModule: TPasModule;
const ANameKinds : TElementNameKinds = [elkDeclaredName, elkName]
): TPasElement;
const ANameKinds : TElementNameKinds
): TPasElement; overload;
function FindElementInModule(
const AName: String;
AModule: TPasModule
): TPasElement; overload;
function FindModule(const AName: String): TPasModule;override;
function IsEnumItemNameUsed(const AName : string; AModule : TPasModule) : Boolean;overload;
function IsEnumItemNameUsed(const AName : string) : Boolean;overload;
@ -168,6 +174,10 @@ type
function IsOfType(AType: TPasType; AClass: TClass): Boolean;
property CaseSensitive : Boolean read FCaseSensitive write FCaseSensitive default CASE_SENSITIVE_DEFAULT;
property DefaultSearchNameKinds : TElementNameKinds
read FDefaultSearchNameKinds
write FDefaultSearchNameKinds
default NAME_KINDS_DEFAULT;
end;
TPasNativeModule = class(TPasModule)
@ -418,68 +428,75 @@ function CreateWstInterfaceSymbolTable(AContainer : TwstPasTreeContainer) : TPas
var
loc_TBaseComplexSimpleContentRemotable : TPasClassType;
locOldNameKinds : TElementNameKinds;
begin
Result := TPasNativeModule(AContainer.CreateElement(TPasNativeModule,'base_service_intf',AContainer.Package,visPublic,'',0));
locOldNameKinds := AContainer.DefaultSearchNameKinds;
AContainer.DefaultSearchNameKinds := [elkDeclaredName,elkName];
try
AContainer.Package.Modules.Add(Result);
AContainer.RegisterExternalAlias(Result,sXSD_NS);
Result.InterfaceSection := TInterfaceSection(AContainer.CreateElement(TInterfaceSection,'',Result,visDefault,'',0));
AddSystemSymbol(Result,AContainer);
AddClassDef(Result,'TBaseRemotable','',TPasNativeClassType);
AContainer.RegisterExternalAlias(AddClassDef(Result,'anyType_Type','TBaseRemotable',TPasNativeClassType),'anyType');
AddClassDef(Result,'TAbstractSimpleRemotable','TBaseRemotable',TPasNativeClassType);
AContainer.RegisterExternalAlias(AddClassDef(Result,'schema_Type','TAbstractSimpleRemotable'),'schema');
AContainer.RegisterExternalAlias(AddClassDef(Result,'TDateRemotable','TAbstractSimpleRemotable'),'date');
AContainer.RegisterExternalAlias(AddClassDef(Result,'TDateTimeRemotable','TAbstractSimpleRemotable'),'dateTime');
{$IFDEF WST_HAS_TDURATIONREMOTABLE}
AContainer.RegisterExternalAlias(AddClassDef(Result,'TDurationRemotable','TAbstractSimpleRemotable'),'duration');
{$ENDIF WST_HAS_TDURATIONREMOTABLE}
AContainer.RegisterExternalAlias(AddClassDef(Result,'TTimeRemotable','TAbstractSimpleRemotable'),'time');
Result := TPasNativeModule(AContainer.CreateElement(TPasNativeModule,'base_service_intf',AContainer.Package,visPublic,'',0));
try
AContainer.Package.Modules.Add(Result);
AContainer.RegisterExternalAlias(Result,sXSD_NS);
Result.InterfaceSection := TInterfaceSection(AContainer.CreateElement(TInterfaceSection,'',Result,visDefault,'',0));
AddSystemSymbol(Result,AContainer);
AddClassDef(Result,'TBaseRemotable','',TPasNativeClassType);
AContainer.RegisterExternalAlias(AddClassDef(Result,'anyType_Type','TBaseRemotable',TPasNativeClassType),'anyType');
AddClassDef(Result,'TAbstractSimpleRemotable','TBaseRemotable',TPasNativeClassType);
AContainer.RegisterExternalAlias(AddClassDef(Result,'schema_Type','TAbstractSimpleRemotable'),'schema');
AContainer.RegisterExternalAlias(AddClassDef(Result,'TDateRemotable','TAbstractSimpleRemotable'),'date');
AContainer.RegisterExternalAlias(AddClassDef(Result,'TDateTimeRemotable','TAbstractSimpleRemotable'),'dateTime');
{$IFDEF WST_HAS_TDURATIONREMOTABLE}
AContainer.RegisterExternalAlias(AddClassDef(Result,'TDurationRemotable','TAbstractSimpleRemotable'),'duration');
{$ENDIF WST_HAS_TDURATIONREMOTABLE}
AContainer.RegisterExternalAlias(AddClassDef(Result,'TTimeRemotable','TAbstractSimpleRemotable'),'time');
AddClassDef(Result,'TAbstractComplexRemotable','TBaseRemotable',TPasNativeClassType);
loc_TBaseComplexSimpleContentRemotable := AddClassDef(Result,'TBaseComplexSimpleContentRemotable','TAbstractComplexRemotable',TPasNativeClassType);
(AContainer.FindElementInModule('TComplexInt16SContentRemotable',Result) as TPasClassType).AncestorType := loc_TBaseComplexSimpleContentRemotable;
(AContainer.FindElementInModule('TComplexFloatDoubleContentRemotable',Result) as TPasClassType).AncestorType := loc_TBaseComplexSimpleContentRemotable;
loc_TBaseComplexSimpleContentRemotable.AddRef();
loc_TBaseComplexSimpleContentRemotable.AddRef();
AddClassDef(Result,'TAbstractComplexRemotable','TBaseRemotable',TPasNativeClassType);
loc_TBaseComplexSimpleContentRemotable := AddClassDef(Result,'TBaseComplexSimpleContentRemotable','TAbstractComplexRemotable',TPasNativeClassType);
(AContainer.FindElementInModule('TComplexInt16SContentRemotable',Result) as TPasClassType).AncestorType := loc_TBaseComplexSimpleContentRemotable;
(AContainer.FindElementInModule('TComplexFloatDoubleContentRemotable',Result) as TPasClassType).AncestorType := loc_TBaseComplexSimpleContentRemotable;
loc_TBaseComplexSimpleContentRemotable.AddRef();
loc_TBaseComplexSimpleContentRemotable.AddRef();
AddClassDef(Result,'TBaseComplexRemotable','TAbstractComplexRemotable',TPasNativeClassType);
AddClassDef(Result,'THeaderBlock','TBaseComplexRemotable',TPasNativeClassType);
AddClassDef(Result,'TSimpleContentHeaderBlock','THeaderBlock',TPasNativeClassType);
AddClassDef(Result,'TBaseArrayRemotable','TAbstractComplexRemotable',TPasNativeClassType);
AddClassDef(Result,'TBaseObjectArrayRemotable','TBaseArrayRemotable',TPasNativeClassType);
AddClassDef(Result,'TBaseSimpleTypeArrayRemotable','TBaseArrayRemotable',TPasNativeClassType);
AddClassDef(Result,'TArrayOfStringRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfBooleanRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt8URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt8SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt16SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt16URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt32URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt32SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt64SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt64URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatSingleRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatDoubleRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatExtendedRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatCurrencyRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TBaseComplexRemotable','TAbstractComplexRemotable',TPasNativeClassType);
AddClassDef(Result,'THeaderBlock','TBaseComplexRemotable',TPasNativeClassType);
AddClassDef(Result,'TSimpleContentHeaderBlock','THeaderBlock',TPasNativeClassType);
AddClassDef(Result,'TBaseArrayRemotable','TAbstractComplexRemotable',TPasNativeClassType);
AddClassDef(Result,'TBaseObjectArrayRemotable','TBaseArrayRemotable',TPasNativeClassType);
AddClassDef(Result,'TBaseSimpleTypeArrayRemotable','TBaseArrayRemotable',TPasNativeClassType);
AddClassDef(Result,'TArrayOfStringRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfBooleanRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt8URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt8SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt16SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt16URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt32URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt32SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt64SRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfInt64URemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatSingleRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatDoubleRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatExtendedRemotable','TBaseSimpleTypeArrayRemotable');
AddClassDef(Result,'TArrayOfFloatCurrencyRemotable','TBaseSimpleTypeArrayRemotable');
AddAlias('token','string',Result);
AddAlias('language','string',Result);
AddAlias('anyURI','string',Result);
AddAlias('ID','string',Result);
//AddAlias('float','Single',Result);
AddAlias('nonNegativeInteger','LongWord',Result);
AddAlias('positiveInteger','nonNegativeInteger',Result);
{$IFNDEF WST_HAS_TDURATIONREMOTABLE}
AddAlias('duration','string',Result);
{$ENDIF WST_HAS_TDURATIONREMOTABLE}
{$IFNDEF WST_HAS_TTIMEREMOTABLE}
AddAlias('time','string',Result);
{$ENDIF WST_HAS_TTIMEREMOTABLE}
except
FreeAndNil(Result);
raise;
AddAlias('token','string',Result);
AddAlias('language','string',Result);
AddAlias('anyURI','string',Result);
AddAlias('ID','string',Result);
//AddAlias('float','Single',Result);
AddAlias('nonNegativeInteger','LongWord',Result);
AddAlias('positiveInteger','nonNegativeInteger',Result);
{$IFNDEF WST_HAS_TDURATIONREMOTABLE}
AddAlias('duration','string',Result);
{$ENDIF WST_HAS_TDURATIONREMOTABLE}
{$IFNDEF WST_HAS_TTIMEREMOTABLE}
AddAlias('time','string',Result);
{$ENDIF WST_HAS_TTIMEREMOTABLE}
except
FreeAndNil(Result);
raise;
end;
finally
AContainer.DefaultSearchNameKinds := locOldNameKinds;
end;
end;
@ -635,6 +652,7 @@ end;
constructor TwstPasTreeContainer.Create();
begin
FCaseSensitive := CASE_SENSITIVE_DEFAULT;
FDefaultSearchNameKinds := NAME_KINDS_DEFAULT;
FPackage := TPasPackage.Create('sample',nil);
FBindingList := TObjectList.Create(True);
FProperties := TPropertyHolder.Create();
@ -794,9 +812,17 @@ begin
end;
end;
function TwstPasTreeContainer.FindElementInModule(
const AName : String;
AModule : TPasModule
) : TPasElement;
begin
Result := FindElementInModule(AName,AModule,DefaultSearchNameKinds);
end;
function TwstPasTreeContainer.FindElement(const AName: String): TPasElement;
begin
Result := FindElement(AName,[elkDeclaredName,elkName]);
Result := FindElement(AName,DefaultSearchNameKinds);
end;
function TwstPasTreeContainer.FindElement(

View File

@ -79,10 +79,14 @@ var
if ( sourceType = sftXsd ) then begin
AppOptions := AppOptions - [ cloProxy, cloImp, cloBinder, cloWsdl ];
end;
if AnsiSameText('S',Trim(GetOptionArg(cloParserCaseSensitive))) then
if (cloParserCaseSensitive in AppOptions) then begin
if AnsiSameText('S',Trim(GetOptionArg(cloParserCaseSensitive))) then
Include(AppOptions,cloParserCaseSensitive);
if AnsiSameText('I',Trim(GetOptionArg(cloParserCaseSensitive))) then
Exclude(AppOptions,cloParserCaseSensitive);
end else begin
Include(AppOptions,cloParserCaseSensitive);
if AnsiSameText('I',Trim(GetOptionArg(cloParserCaseSensitive))) then
Exclude(AppOptions,cloParserCaseSensitive);
end;
end;
function GenerateSymbolTable() : Boolean ;

View File

@ -440,24 +440,31 @@ procedure TWsdlParser.Execute(const AMode: TParserMode; const AModuleName: strin
var
locSrvcCrs : IObjectCursor;
locObj : TDOMNodeRttiExposer;
locOldNameKinds : TElementNameKinds;
begin
Prepare(AModuleName);
locOldNameKinds := FSymbols.DefaultSearchNameKinds;
FSymbols.DefaultSearchNameKinds := [elkDeclaredName];
try
Prepare(AModuleName);
locSrvcCrs := FServiceCursor.Clone() as IObjectCursor;
locSrvcCrs.Reset();
while locSrvcCrs.MoveNext() do begin
locObj := locSrvcCrs.GetCurrent() as TDOMNodeRttiExposer;
ParseService(locObj.InnerObject);
locSrvcCrs := FServiceCursor.Clone() as IObjectCursor;
locSrvcCrs.Reset();
while locSrvcCrs.MoveNext() do begin
locObj := locSrvcCrs.GetCurrent() as TDOMNodeRttiExposer;
ParseService(locObj.InnerObject);
end;
if ( AMode = pmAllTypes ) then begin
ParseTypes();
end;
ParseForwardDeclarations();
SymbolTable.SetCurrentModule(FModule);
ExtractNameSpace();
FixUsesList();
finally
FSymbols.DefaultSearchNameKinds := locOldNameKinds;
end;
if ( AMode = pmAllTypes ) then begin
ParseTypes();
end;
ParseForwardDeclarations();
SymbolTable.SetCurrentModule(FModule);
ExtractNameSpace();
FixUsesList();
end;
function TWsdlParser.ParseOperation(

View File

@ -115,13 +115,15 @@ type
FIncludeList : TStringList;
FIncludeParsed : Boolean;
FPrepared : Boolean;
FOldNameKinds : TElementNameKinds;
private
procedure DoOnMessage(const AMsgType : TMessageType; const AMsg : string);
private
function FindNamedNode(AList : IObjectCursor; const AName : WideString; const AOrder : Integer = 0):TDOMNode;
function GetParentContext() : IParserContext;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Prepare(const AMustSucceed : Boolean);
function FindElement(const AName: String) : TPasElement; {$IFDEF USE_INLINE}inline;{$ENDIF}
function FindElement(const AName: String) : TPasElement; overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
function FindElement(const AName: String; const ANameKinds : TElementNameKinds) : TPasElement; overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
protected
function GetXsShortNames() : TStrings;
function GetSymbolTable() : TwstPasTreeContainer;
@ -217,6 +219,8 @@ begin
FDoc := ADoc;
FParentContext := Pointer(AParentContext);
FSymbols := ASymbols;
FOldNameKinds := FSymbols.DefaultSearchNameKinds;
FSymbols.DefaultSearchNameKinds := [elkDeclaredName];
FSchemaNode := ASchemaNode;
FNameSpaceList := TStringList.Create();
@ -242,6 +246,8 @@ destructor TCustomXsdSchemaParser.Destroy();
end;
begin
if (FSymbols <> nil) then
FSymbols.DefaultSearchNameKinds := FOldNameKinds;
FParentContext := nil;
FreeAndNil(FIncludeList);
FreeList(FNameSpaceList);
@ -298,6 +304,16 @@ begin
Result := SymbolTable.FindElement(AName);
end;
function TCustomXsdSchemaParser.FindElement(
const AName : String;
const ANameKinds : TElementNameKinds
) : TPasElement;
begin
Result := SymbolTable.FindElementInModule(AName,FModule,ANameKinds);
if ( Result = nil ) then
Result := SymbolTable.FindElement(AName,ANameKinds);
end;
procedure TCustomXsdSchemaParser.ParseImportDocuments();
var
locOldCurrentModule : TPasModule;
@ -638,7 +654,7 @@ var
if ASimpleTypeAlias.InheritsFrom(TPasNativeSimpleType) then begin
locTypeHint := ExtractTypeHint(typNd);
if not IsStrEmpty(locTypeHint) then begin
locHintedType := FindElement(locTypeHint) as TPasType;
locHintedType := FindElement(locTypeHint,[elkName]) as TPasType;
if ( locHintedType <> nil ) then
ASimpleTypeAlias := locHintedType;
end;