You've already forked lazarus-ccr
Fix empty complexType parsing
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@552 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -10,6 +10,8 @@
|
|||||||
<types>
|
<types>
|
||||||
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:wst-test">
|
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:wst-test">
|
||||||
|
|
||||||
|
<xsd:complexType name="TEmptyHeader" wst:wst_headerBlock="true" />
|
||||||
|
|
||||||
<xsd:complexType name="TSampleHeader" wst:wst_headerBlock="true">
|
<xsd:complexType name="TSampleHeader" wst:wst_headerBlock="true">
|
||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="intField" type="xsd:int"/>
|
<xsd:element name="intField" type="xsd:int"/>
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<schema xmlns:tns="class_headerblock_derived" xmlns:wst="urn:wst_base" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="class_headerblock_derived">
|
<schema xmlns:tns="class_headerblock_derived" xmlns:wst="urn:wst_base" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="class_headerblock_derived">
|
||||||
|
|
||||||
|
<xsd:complexType name="TEmptyHeader" wst:wst_headerBlock="true" />
|
||||||
|
|
||||||
<xsd:complexType name="TSampleHeader" wst:wst_headerBlock="true">
|
<xsd:complexType name="TSampleHeader" wst:wst_headerBlock="true">
|
||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="intField" type="xsd:int"/>
|
<xsd:element name="intField" type="xsd:int"/>
|
||||||
|
@@ -300,6 +300,13 @@ begin
|
|||||||
mdl := TPasModule(tr.CreateElement(TPasModule,'class_headerblock_derived',tr.Package,visDefault,'',0));
|
mdl := TPasModule(tr.CreateElement(TPasModule,'class_headerblock_derived',tr.Package,visDefault,'',0));
|
||||||
tr.Package.Modules.Add(mdl);
|
tr.Package.Modules.Add(mdl);
|
||||||
mdl.InterfaceSection := TPasSection(tr.CreateElement(TPasSection,'',mdl,visDefault,'',0));
|
mdl.InterfaceSection := TPasSection(tr.CreateElement(TPasSection,'',mdl,visDefault,'',0));
|
||||||
|
cltyp := TPasClassType(tr.CreateElement(TPasClassType,'TEmptyHeader',mdl.InterfaceSection,visDefault,'',0));
|
||||||
|
cltyp.ObjKind := okClass;
|
||||||
|
cltyp.AncestorType := tr.FindElementNS('THeaderBlock',s_xs) as TPasType;
|
||||||
|
cltyp.AncestorType.AddRef();
|
||||||
|
mdl.InterfaceSection.Declarations.Add(cltyp);
|
||||||
|
mdl.InterfaceSection.Types.Add(cltyp);
|
||||||
|
|
||||||
cltyp := TPasClassType(tr.CreateElement(TPasClassType,'TSampleHeader',mdl.InterfaceSection,visDefault,'',0));
|
cltyp := TPasClassType(tr.CreateElement(TPasClassType,'TSampleHeader',mdl.InterfaceSection,visDefault,'',0));
|
||||||
cltyp.ObjKind := okClass;
|
cltyp.ObjKind := okClass;
|
||||||
cltyp.AncestorType := tr.FindElementNS('THeaderBlock',s_xs) as TPasType;
|
cltyp.AncestorType := tr.FindElementNS('THeaderBlock',s_xs) as TPasType;
|
||||||
|
@@ -1172,7 +1172,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTest_CustomXsdParser.class_headerblock_derived();
|
procedure TTest_CustomXsdParser.class_headerblock_derived();
|
||||||
const s_class_name = 'TSampleHeader';
|
const s_class_name = 'TSampleHeader'; s_emty_class_name = 'TEmptyHeader';
|
||||||
var
|
var
|
||||||
tr : TwstPasTreeContainer;
|
tr : TwstPasTreeContainer;
|
||||||
mdl : TPasModule;
|
mdl : TPasModule;
|
||||||
@@ -1183,6 +1183,14 @@ begin
|
|||||||
try
|
try
|
||||||
mdl := tr.FindModule('class_headerblock_derived');
|
mdl := tr.FindModule('class_headerblock_derived');
|
||||||
CheckNotNull(mdl,'class_headerblock_derived');
|
CheckNotNull(mdl,'class_headerblock_derived');
|
||||||
|
elt := tr.FindElement(s_emty_class_name);
|
||||||
|
CheckNotNull(elt,s_emty_class_name);
|
||||||
|
CheckEquals(s_emty_class_name,elt.Name);
|
||||||
|
CheckEquals(s_emty_class_name,tr.GetExternalName(elt));
|
||||||
|
CheckIs(elt,TPasClassType);
|
||||||
|
clsType := elt as TPasClassType;
|
||||||
|
CheckNotNull(clsType.AncestorType,'AncestorType is null');
|
||||||
|
CheckSame(tr.FindElementNS('THeaderBlock',sXSD_NS),clsType.AncestorType);
|
||||||
elt := tr.FindElement(s_class_name);
|
elt := tr.FindElement(s_class_name);
|
||||||
CheckNotNull(elt,s_class_name);
|
CheckNotNull(elt,s_class_name);
|
||||||
CheckEquals(s_class_name,elt.Name);
|
CheckEquals(s_class_name,elt.Name);
|
||||||
@@ -1191,6 +1199,7 @@ begin
|
|||||||
clsType := elt as TPasClassType;
|
clsType := elt as TPasClassType;
|
||||||
CheckNotNull(clsType.AncestorType,'AncestorType is null');
|
CheckNotNull(clsType.AncestorType,'AncestorType is null');
|
||||||
CheckSame(tr.FindElementNS('THeaderBlock',sXSD_NS),clsType.AncestorType);
|
CheckSame(tr.FindElementNS('THeaderBlock',sXSD_NS),clsType.AncestorType);
|
||||||
|
|
||||||
finally
|
finally
|
||||||
tr.Free();
|
tr.Free();
|
||||||
end;
|
end;
|
||||||
|
@@ -125,6 +125,8 @@ type
|
|||||||
const AInternalName : string;
|
const AInternalName : string;
|
||||||
const AHasInternalName : Boolean
|
const AHasInternalName : Boolean
|
||||||
) : TPasArrayType;
|
) : TPasArrayType;
|
||||||
|
function IsHeaderBlock() : Boolean;
|
||||||
|
function IsSimpleContentHeaderBlock() : Boolean;
|
||||||
private
|
private
|
||||||
procedure CreateNodeCursors();
|
procedure CreateNodeCursors();
|
||||||
procedure ExtractTypeName();
|
procedure ExtractTypeName();
|
||||||
@@ -554,6 +556,20 @@ begin
|
|||||||
FSymbols.RegisterExternalAlias(Result,ATypeName);
|
FSymbols.RegisterExternalAlias(Result,ATypeName);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TComplexTypeParser.IsHeaderBlock() : Boolean;
|
||||||
|
var
|
||||||
|
strBuffer : string;
|
||||||
|
begin
|
||||||
|
Result := wst_findCustomAttributeXsd(FContext.GetXsShortNames(),FTypeNode,s_WST_headerBlock,strBuffer) and AnsiSameText('true',Trim(strBuffer));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TComplexTypeParser.IsSimpleContentHeaderBlock() : Boolean;
|
||||||
|
var
|
||||||
|
strBuffer : string;
|
||||||
|
begin
|
||||||
|
Result := wst_findCustomAttributeXsd(FContext.GetXsShortNames(),FTypeNode,s_WST_headerBlockSimpleContent,strBuffer) and AnsiSameText('true',Trim(strBuffer));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TComplexTypeParser.CreateNodeCursors();
|
procedure TComplexTypeParser.CreateNodeCursors();
|
||||||
begin
|
begin
|
||||||
FAttCursor := CreateAttributesCursor(FTypeNode,cetRttiNode);
|
FAttCursor := CreateAttributesCursor(FTypeNode,cetRttiNode);
|
||||||
@@ -866,20 +882,6 @@ var
|
|||||||
ExtractExtendedMetadata(locProp,AElement);
|
ExtractExtendedMetadata(locProp,AElement);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function IsHeaderBlock() : Boolean;
|
|
||||||
var
|
|
||||||
strBuffer : string;
|
|
||||||
begin
|
|
||||||
Result := wst_findCustomAttributeXsd(FContext.GetXsShortNames(),FTypeNode,s_WST_headerBlock,strBuffer) and AnsiSameText('true',Trim(strBuffer));
|
|
||||||
end;
|
|
||||||
|
|
||||||
function IsSimpleContentHeaderBlock() : Boolean;
|
|
||||||
var
|
|
||||||
strBuffer : string;
|
|
||||||
begin
|
|
||||||
Result := wst_findCustomAttributeXsd(FContext.GetXsShortNames(),FTypeNode,s_WST_headerBlockSimpleContent,strBuffer) and AnsiSameText('true',Trim(strBuffer));
|
|
||||||
end;
|
|
||||||
|
|
||||||
function IsRecordType() : Boolean;
|
function IsRecordType() : Boolean;
|
||||||
var
|
var
|
||||||
strBuffer : string;
|
strBuffer : string;
|
||||||
@@ -1213,7 +1215,12 @@ begin
|
|||||||
TPasClassType(Result).ObjKind := okClass;
|
TPasClassType(Result).ObjKind := okClass;
|
||||||
if hasInternalName then
|
if hasInternalName then
|
||||||
FSymbols.RegisterExternalAlias(Result,ATypeName);
|
FSymbols.RegisterExternalAlias(Result,ATypeName);
|
||||||
TPasClassType(Result).AncestorType := FSymbols.FindElementInModule('TBaseComplexRemotable',FSymbols.FindModule('base_service_intf') as TPasModule) as TPasType;
|
if IsHeaderBlock() then
|
||||||
|
TPasClassType(Result).AncestorType := FSymbols.FindElementInModule('THeaderBlock',FSymbols.FindModule('base_service_intf') as TPasModule) as TPasType
|
||||||
|
else if IsSimpleContentHeaderBlock() then
|
||||||
|
TPasClassType(Result).AncestorType := FSymbols.FindElementInModule('TSimpleContentHeaderBlock',FSymbols.FindModule('base_service_intf') as TPasModule) as TPasType
|
||||||
|
else
|
||||||
|
TPasClassType(Result).AncestorType := FSymbols.FindElementInModule('TBaseComplexRemotable',FSymbols.FindModule('base_service_intf') as TPasModule) as TPasType;
|
||||||
TPasClassType(Result).AncestorType.AddRef();
|
TPasClassType(Result).AncestorType.AddRef();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user