comparison xslt/generator.csharp.xsl @ 5:6f67d3a6b950

sync
author cin
date Fri, 02 Mar 2018 18:34:19 +0300
parents d240adc2ac70
children 1f4009d4afb6
comparison
equal deleted inserted replaced
4:d240adc2ac70 5:6f67d3a6b950
24 <xsl:template match="m:entity" mode="document"> 24 <xsl:template match="m:entity" mode="document">
25 <xsl:apply-templates select="." mode="entity"/> 25 <xsl:apply-templates select="." mode="entity"/>
26 </xsl:template> 26 </xsl:template>
27 27
28 <xsl:template match="m:entity" mode="entity"> 28 <xsl:template match="m:entity" mode="entity">
29 <!-- select all members -->
29 <xsl:variable name="members"> 30 <xsl:variable name="members">
30 <xsl:apply-templates mode="fiter-members"/> 31 <xsl:apply-templates mode="fiter-members"/>
31 </xsl:variable> 32 </xsl:variable>
33
32 <cs:class modifiers="partial"> 34 <cs:class modifiers="partial">
35 <!-- generate class name -->
33 <xsl:attribute name="name"> 36 <xsl:attribute name="name">
34 <xsl:apply-templates select="." mode="class-name"/> 37 <xsl:apply-templates select="." mode="class-name"/>
35 </xsl:attribute> 38 </xsl:attribute>
39 <xsl:attribute name="modifiers">
40 <xsl:apply-templates select="." mode="class-modifiers"/>
41 </xsl:attribute>
42
36 <xsl:apply-templates mode="class-attributes" /> 43 <xsl:apply-templates mode="class-attributes" />
37 <xsl:apply-templates select="exsl:node-set($members)" mode="members" /> 44 <xsl:apply-templates select="exsl:node-set($members)" mode="members" />
38 </cs:class> 45 </cs:class>
39 </xsl:template> 46 </xsl:template>
40 47
43 <xsl:value-of select="@name"/> 50 <xsl:value-of select="@name"/>
44 </xsl:template> 51 </xsl:template>
45 52
46 <xsl:template match="*[@clr:name]" mode="class-name"> 53 <xsl:template match="*[@clr:name]" mode="class-name">
47 <xsl:value-of select="@clr:name"/> 54 <xsl:value-of select="@clr:name"/>
55 </xsl:template>
56
57 <!-- class-modifiers -->
58 <xsl:template match="*" mode="class-modifiers">
59 <xsl:text>partial</xsl:text>
48 </xsl:template> 60 </xsl:template>
49 61
50 <!-- class-attributes --> 62 <!-- class-attributes -->
51 <xsl:template match="*|text()" mode="class-attributes" /> 63 <xsl:template match="*|text()" mode="class-attributes" />
52 64
62 <xsl:template match="*|text()" mode="members" /> 74 <xsl:template match="*|text()" mode="members" />
63 75
64 <xsl:template match="m:primaryKey | m:property | m:thisKey | clr:association" mode="members"> 76 <xsl:template match="m:primaryKey | m:property | m:thisKey | clr:association" mode="members">
65 <t:trace msg="{name()} {@name}"/> 77 <t:trace msg="{name()} {@name}"/>
66 <xsl:apply-templates select="." mode="property"/> 78 <xsl:apply-templates select="." mode="property"/>
67 </xsl:template>
68
69 <xsl:template match="m:thisKey" mode="members">
70 <xsl:variable name="properties">
71
72 </xsl:variable>
73 </xsl:template> 79 </xsl:template>
74 80
75 <!-- hasA and hasMany doesn't generate members itself, they delegate this work to inner members --> 81 <!-- hasA and hasMany doesn't generate members itself, they delegate this work to inner members -->
76 <xsl:template match="m:hasA | m:hasMany" mode="members"> 82 <xsl:template match="m:hasA | m:hasMany" mode="members">
77 <t:trace msg="{name()} {@name}" /> 83 <t:trace msg="{name()} {@name}" />
139 <xsl:apply-templates select="." mode="property-extension" /> 145 <xsl:apply-templates select="." mode="property-extension" />
140 <xsl:apply-templates select="." mode="property-accessors"/> 146 <xsl:apply-templates select="." mode="property-accessors"/>
141 </cs:property> 147 </cs:property>
142 </xsl:template> 148 </xsl:template>
143 149
150
144 <!-- property-name --> 151 <!-- property-name -->
145 <xsl:template match="m:hasA/clr:association[not(@name|@clr:name)]" mode="property-name"> 152 <xsl:template match="m:hasA/clr:association[not(@name|@clr:name)]" mode="property-name">
146 <!-- if the association doesn't define a name, use it from the parent node --> 153 <!-- if the association doesn't define a name, use it from the parent node -->
147 <xsl:apply-templates select=".." mode="property-name"/> 154 <xsl:apply-templates select=".." mode="property-name"/>
148 </xsl:template> 155 </xsl:template>
159 <xsl:template match="*" mode="property-modifiers"> 166 <xsl:template match="*" mode="property-modifiers">
160 <xsl:text>public</xsl:text> 167 <xsl:text>public</xsl:text>
161 </xsl:template> 168 </xsl:template>
162 169
163 <!-- property-type --> 170 <!-- property-type -->
171 <xsl:template match="*" mode="property-type">
172 <xsl:apply-templates select="." mode="member-type"/>
173 </xsl:template>
174
164 <xsl:template match="m:hasA[@type]/clr:association[not(clr:type)]" mode="property-type"> 175 <xsl:template match="m:hasA[@type]/clr:association[not(clr:type)]" mode="property-type">
165 <xsl:apply-templates select=".." mode="property-type"/> 176 <xsl:apply-templates select=".." mode="property-type"/>
166 </xsl:template> 177 </xsl:template>
167 178
168 <xsl:template match="m:hasMany[@type]/clr:association[not(clr:type)]" mode="property-type"> 179 <xsl:template match="m:hasMany[@type]/clr:association[not(clr:type)]" mode="property-type">
170 <xsl:apply-templates select=".." mode="property-type"/> 181 <xsl:apply-templates select=".." mode="property-type"/>
171 </cs:array> 182 </cs:array>
172 </xsl:template> 183 </xsl:template>
173 184
174 <xsl:template match="m:hasA[@type]/m:thisKey" mode="property-type"> 185 <xsl:template match="m:hasA[@type]/m:thisKey" mode="property-type">
175 <xsl:call-template name="getPrimaryKey"> 186 <xsl:variable name="otherKey">
176 <xsl:with-param name="type" select="../@type"/>
177 </xsl:call-template>
178 </xsl:template>
179
180 <xsl:template match="m:hasA[@type and boolean(@optional)]/m:thisKey" mode="property-type">
181 <cs:nullable>
182 <xsl:call-template name="getPrimaryKey"> 187 <xsl:call-template name="getPrimaryKey">
183 <xsl:with-param name="type" select="../@type"/> 188 <xsl:with-param name="type" select="../@type"/>
184 </xsl:call-template> 189 </xsl:call-template>
185 </cs:nullable> 190 </xsl:variable>
186 </xsl:template> 191 <xsl:choose>
187 192 <xsl:when test="@optional">
188 <xsl:template match="*" mode="property-type"> 193 </xsl:when>
189 <xsl:apply-templates select="." mode="member-type"/> 194 <cs:nullable>
195 <xsl:apply-templates select="exsl:node-set($otherKey)" mode="property-type"/>
196 </cs:nullable>
197 <xsl:otherwise>
198 <xsl:apply-templates select="exsl:node-set($otherKey)" mode="property-type"/>
199 </xsl:otherwise>
200 </xsl:choose>
190 </xsl:template> 201 </xsl:template>
191 202
192 <!-- property-attributes --> 203 <!-- property-attributes -->
193 <xsl:template match="m:primaryKey" mode="property-attributes"> 204 <xsl:template match="m:primaryKey" mode="property-attributes">
194 <cs:attribute> 205 <cs:attribute>
327 <xsl:apply-templates select="." mode="member-type"/> 338 <xsl:apply-templates select="." mode="member-type"/>
328 </xsl:template> 339 </xsl:template>
329 <!-- field-initializer --> 340 <!-- field-initializer -->
330 <xsl:template match="*|text()" mode="field-initializer"/> 341 <xsl:template match="*|text()" mode="field-initializer"/>
331 342
332 <xsl:template name="getKeyClrMemberName"> 343 <xsl:template name="getClrKeyReference">
333 <xsl:param name="explicitMemberName" select="''"/>
334 <xsl:param name="type"/> 344 <xsl:param name="type"/>
335 <xsl:param name="short" select="false()"/> 345 <xsl:variable name="primaryKey">
346 <xsl:call-template name="getPrimaryKey">
347 <xsl:with-param name="type" select="$type"/>
348 </xsl:call-template>
349 </xsl:variable>
350
351 <xsl:apply-templates select="exsl:node-set($primaryKey)" mode="clr-member-reference"/>
352 </xsl:template>
353
354 <!-- -->
355 <xsl:template name="getClrMemberReference">
356 <xsl:param name="type"/>
357 <xsl:param name="memberName"/>
358 <xsl:param name="scope" select="members"/>
359 <xsl:variable name="member">
360 <xsl:call-template name="getMembers">
361 <xsl:with-param name="memberName" select="$memberName"/>
362 <xsl:with-param name="type" select="$type"/>
363 </xsl:call-template>
364 </xsl:variable>
365
366 <xsl:apply-templates select="exsl:node-set($member)" mode="clr-member-reference"/>
367 </xsl:template>
368
369 <xsl:template match="*" mode="clr-member-reference">
370 <xsl:param name="$type" select="@declaringType"/>
336 <cs:member> 371 <cs:member>
337 <xsl:choose> 372 <xsl:attribute name="name">
338 <xsl:when test="$explicitMemberName"> 373 <xsl:apply-templates select="." mode="member-name"/>
339 <xsl:attribute name="name"> 374 </xsl:attribute>
340 <xsl:value-of select="$explicitMemberName"/> 375 <xsl:call-template name="getClrType">
341 </xsl:attribute> 376 <xsl:with-param name="type" select="$type"/>
342 </xsl:when> 377 </xsl:call-template>
343 <xsl:otherwise>
344 <xsl:attribute name="name">
345 <xsl:call-template name="getKeyName">
346 <xsl:with-param name="type" select="$type"/>
347 </xsl:call-template>
348 </xsl:attribute>
349 </xsl:otherwise>
350 </xsl:choose>
351 <xsl:if test="not($short)">
352 <xsl:call-template name="getClrType">
353 <xsl:with-param name="type" select="$type"/>
354 </xsl:call-template>
355 </xsl:if>
356 </cs:member> 378 </cs:member>
357 </xsl:template> 379 </xsl:template>
358 380
359 <xsl:template name="getClrMemberName">
360 <xsl:param name="memberName"/>
361 <xsl:param name="type"/>
362 <xsl:param name="explicitMemberName" select="''"/>
363 <xsl:param name="short" select="false()"/>
364 <cs:member>
365 <xsl:choose>
366 <xsl:when test="$explicitMemberName">
367 <xsl:attribute name="name">
368 <xsl:value-of select="$explicitMemberName"/>
369 </xsl:attribute>
370 </xsl:when>
371 <xsl:otherwise>
372 <xsl:attribute name="name">
373 <xsl:call-template name="getClrPropertyName">
374 <xsl:with-param name="member" select="$memberName"/>
375 <xsl:with-param name="type" select="$type"/>
376 </xsl:call-template>
377 </xsl:attribute>
378 </xsl:otherwise>
379 </xsl:choose>
380 <xsl:if test="not($short)">
381 <xsl:call-template name="getClrType">
382 <xsl:with-param name="type" select="$type"/>
383 </xsl:call-template>
384 </xsl:if>
385 </cs:member>
386 </xsl:template>
387
388 <!-- lookups for the specified member for the specified type
389 and returns the CLR property name -->
390 <xsl:template name="getClrPropertyName">
391 <xsl:param name="type"/>
392 <xsl:param name="member"/>
393 <!-- prevents cyclic references -->
394 <xsl:param name="seen" select="/.."/>
395 <xsl:for-each select="$module">
396 <xsl:apply-templates select="key('type', $type)"
397 mode="member-lookup">
398 <xsl:with-param name="member" select="$member"/>
399 <xsl:with-param name="seen" select="$seen"/>
400 </xsl:apply-templates>
401 </xsl:for-each>
402 </xsl:template>
403 381
404 <!-- resolves CLR type for the given type --> 382 <!-- resolves CLR type for the given type -->
405 <xsl:template name="getClrType"> 383 <xsl:template name="getClrType">
406 <xsl:param name="type" /> 384 <xsl:param name="type" />
407 <xsl:param name="typeArgs" select="/.." /> 385 <xsl:param name="typeArgs" select="/.." />